MainPage布局中忽略UserControl维度

时间:2011-04-05 20:59:55

标签: wpf silverlight-4.0 wpf-controls grid

我有一个Canvas,上面有Grid。网格包含3列。第一列包含另一个Grid,第二列包含任何内容,第三列包含一个图像(一个框)。 (我的动画目的空白栏与此问题无关。)

在我的孩子Grid我有2行。第一行包含UserControl(框架),第二行包含图像(条形码)。

问题是布局引擎似乎完全忽略了用户控件的尺寸。在预览中,我看到了我的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>

3 个答案:

答案 0 :(得分:1)

您的用户控件的ActualHeight很可能为零。查看用户控件的XAML,您应该只需在用户控件的XAML中设置HeightWidth

答案 1 :(得分:0)

我无法确定图像中的UserControl是什么,但如果将属性设置为“已折叠”,则引擎将无法读取我认为不合适的大小。如果UserControl不可见,但您想显示尺寸,请为不透明度属性设置动画,而不是显示性。条形码位于第1行,如果是第2行,它是第一行?

我是否正确假设条形码需要位于带有2行方框的图像下方? UserControl在哪里?它是什么?

答案 2 :(得分: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