【问题标题】:UserControl Dimensions Ignored in MainPage Layout主页布局中忽略的用户控件尺寸
【发布时间】:2011-04-05 20:59:55
【问题描述】:

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

在我的孩子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>

【问题讨论】:

    标签: wpf silverlight-4.0 wpf-controls grid


    【解决方案1】:

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

    【讨论】:

    • 但我不想。我希望 UserControl 动态调整大小,并且随着其大小的变化,父级做出相应的反应。现在,我唯一的尺寸变化是加载时货架的不同图片,但将来我会在运行时定期更新图片。如何让布局适应这些条件?
    • 我刚刚检查过:ActualHeight 确实为 0。为什么它会为 0,即使在所有内容都已加载和渲染之后?毕竟,我看到了图像,它很明显不是 0。
    【解决方案2】:

    我无法从您的图像中确定什么是 UserControl,但如果您将属性设置为“折叠”,引擎将不会读取我认为的大小。如果 UserControl 不可见,但您想显示尺寸,请为 opacity 属性设置动画而不是可见性。条形码在第一行,也就是第一行,它应该在第二行吗?

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

    【讨论】:

    • 我以为第 0 行是第一行,第 1 行是第二行。无论如何,将第 1 行更改为第 2 行并没有什么不同。
    【解决方案3】:

    我的问题的答案似乎是将以下代码放在我的 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
    

    【讨论】:

    • 我突然想到Canvas 无论如何都不允许屏幕缩放;因此,这是我目前能找到的最佳答案。如果有人有更好的解决方案,我会很乐意接受它,如果可行,我会给予他们信任。
    猜你喜欢
    • 2013-07-17
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2012-03-19
    相关资源
    最近更新 更多