2011-04-05 2 views
0

CanvasGrid이 있습니다. 그리드에는 3 개의 열이 있습니다. 첫 번째 열은 다른 Grid을 포함하고 두 번째 열은 아무 것도 포함하지 않으며 세 번째 열은 이미지 (상자)를 포함합니다. (이 질문과 관련없는 애니메이션 목적의 빈 칸이 있습니다.)UserControl Dimensions는 MainPage에서 무시됩니다.

내 자식에 Grid 2 행이 있습니다. 첫 번째 행에는 UserControl (상자 선반)이 있고 두 번째 행에는 Image (바코드)가 있습니다.

문제는 레이아웃 엔진이 사용자 정의 컨트롤의 크기를 완전히 무시하는 것 같습니다. 미리보기에서 나는 UserControl을보고 다른 두 개의 이미지를 직접 볼 수 있습니다. 부여 된 Canvas은 자동으로 자식의 크기를 지정하지 않지만 해당 페이지의 SizeChanged 이벤트에서 일부 크기 조정 문과 함께 해결할 수 있습니다.

그렇듯이 런타임에 상자가 내 오른쪽 하단 모서리에 나타나지만 바코드는 UserControl이없는 것처럼 배치됩니다. 내 문제의 그림은

다음 http://www.wynright.com/temp/Problem.png

를 참조하십시오 나의 XAML 코드 :

<Canvas x:Name="MainCanvas" Background="Silver"> 
    <Grid Name="LayoutRoot"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="Auto"/> 
     </Grid.ColumnDefinitions> 
     <Grid Name="LayoutChild" Grid.Column="0"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 
      <LightPickDemo:Picker x:Name="PickZone" ZoneCleared="PickZone_ZoneCleared" HorizontalAlignment="Left" VerticalAlignment="Top" /> 
      <Image Name="BarCode" Source="/LightPickDemo;component/Images/BarcodeScan.png" HorizontalAlignment="Center" Stretch="None" VerticalAlignment="Center" Grid.Row="1" /> 
     </Grid> 
     <Image Name="imgShippingBox" Source="/LightPickDemo;component/Images/Empty-Box.png" VerticalAlignment="Bottom" Stretch="None" Grid.Column="2" /> 
    </Grid> 
</Canvas> 
그래서 궁금 내가 무엇을 얻기 위해 어떻게해야합니까 UserControl은 레이아웃 엔진을위한 크기를 제공합니다. 내 디자이너는 컨트롤의 크기를 볼 수 있으므로 컴파일러는이 컨트롤에 크기가 있다는 것을 분명히 알고 있습니다.

바코드를 UserControl 아래 가운데에 표시하고 싶습니다. 여기

은 UserControl을위한 XAML입니다 :

<Canvas> 
    <Image Name="ImageBase" Source="/LightPickDemo;component/Images/BayShelves.png" /> 
    <LightPickDemo:ZoneLight x:Name="ZoneLight" Canvas.Left="345" Canvas.Top="0" ButtonPress="ZoneLight_ButtonPress" /> 
    <LightPickDemo:PickerModule x:Name="pickerCalculator" Canvas.Left="74" Canvas.Top="266" OnPicked="Picker_PickChanged" /> 
    <LightPickDemo:PickerModule x:Name="pickerCalendar" Canvas.Left="207" Canvas.Top="266" OnPicked="Picker_PickChanged" /> 
    <LightPickDemo:PickerModule x:Name="pickerPaperClip" Canvas.Left="521" Canvas.Top="266" OnPicked="Picker_PickChanged" /> 
    <LightPickDemo:PickerModule x:Name="pickerRuler" Canvas.Left="649" Canvas.Top="266" OnPicked="Picker_PickChanged" /> 
    <LightPickDemo:PickerModule x:Name="pickerScissor" Canvas.Left="75" Canvas.Top="532" OnPicked="Picker_PickChanged" /> 
    <LightPickDemo:PickerModule x:Name="pickerStapler" Canvas.Left="250" Canvas.Top="532" OnPicked="Picker_PickChanged" /> 
    <LightPickDemo:PickerModule x:Name="pickerStapleRemover" Canvas.Left="435" Canvas.Top="532" OnPicked="Picker_PickChanged" /> 
    <LightPickDemo:PickerModule x:Name="pickerTapeDispenser" Canvas.Left="635" Canvas.Top="532" OnPicked="Picker_PickChanged" /> 
</Canvas> 

답변

0

내 질문에 대한 대답은 내 UserControl에 다음 코드를 넣는 것으로 보입니다. 그러나 이것이 가장 좋은 대답이라고 상상할 수 없으며 화면 크기 조정을 전혀 허용하지 않는다는 것을 알고 있습니다. 그러니 제발, 만약 이걸 올바르게하는 방법을 아는 사람이 있으면 알려주세요.

Wallstreet Programmer 덕분에이 대안으로 안내 할 수 있습니다.

Protected Overrides Function MeasureOverride(ByVal availableSize As System.Windows.Size) As System.Windows.Size 
    Dim bmp As BitmapImage 
    bmp = BaseImage.Source 
    Return New Size(bmp.PixelWidth, bmp.PixelHeight) 
    'Return MyBase.MeasureOverride(availableSize) 
End Function 
+0

캔버스는 스크린 스케일링을 허용하지 않는다. 그러므로, 지금 제가 찾을 수있는 최선의 대답입니다. 누구든지 더 나은 솔루션을 가지고 있다면 기꺼이 받아들이게되어 기쁘다. – cjbarth

0

나는 당신의 이미지에서 UserControl을 무엇인지를 결정하지만, 당신이 속성을 설정하면 '붕괴'수 없습니다 엔진은 내가 생각하지 않는 크기를 읽지 않을 것이다. UserControl이 보이지 않지만 크기를 표시하려면 가시성 대신 불투명도 속성에 애니메이션을 적용하십시오. 바코드가 행 1에 있고 행 2에 있어야합니까?

바코드가 2 줄의 상자가있는 이미지 아래에 있어야한다고 가정하면 정확합니까? UserControl은 어디에 있습니까? 이게 뭐야?

+0

UserControl은 올바른 상자의 두 행입니다. – cjbarth

+0

행 0이 맨 위 행이고 행 1이 두 번째 행이라고 생각했습니다. 어쨌든 행 1을 2 행으로 변경해도 차이는 없습니다. – cjbarth

1

대부분 사용자 컨트롤의 ActualHeight은 0입니다. 사용자 정의 컨트롤에 대해 XAML을 보면 사용자 정의 컨트롤의 XAML에 HeightWidth을 설정하면됩니다.

+0

하지만 나는 싫어. UserControl을 동적으로 크기 조정하고 크기가 변경되면 그에 따라 적절하게 반응하는 부모를 원합니다. 현재 내가 가지고있는 유일한 크기 변경 사항은로드 중 선반의 그림이 다르다는 것입니다.하지만 앞으로는 런타임 중에 이미지가 주기적으로 업데이트됩니다. 이러한 조건에서 레이아웃을 사용하려면 어떻게해야합니까? – cjbarth

+0

방금 ​​확인했습니다. ActualHeight는 실제로 0입니다. 모든 것이로드되고 렌더링 된 후에도 왜 0이 될까요? 결국, 나는 이미지를보고 _clearly_는 0이 아니다. – cjbarth