当ColumnDefinitions的宽度是动态的时,WPF会产生不希望的边距?

时间:2012-10-12 15:14:32

标签: c# .net wpf grid-layout

这是一个包含UserControl的WPF窗口。 UserControl是一个简单的Grid,有2列没有明确的宽度。在第一列中,我添加了一个简单的TextBox设置以水平拉伸。第二列是空的。

当我缩小窗口的宽度时,WPF会裁剪我的UserControl,即使它的右侧仍然有一个巨大的空白区域!看起来它试图让我的第二列与我的第一列相同,即使它是空的,但奇怪的是,这发生在我的UserControl之外(否则空白区域将是粉红色的!)...

MainWindow.XAML

<Window x:Class="WPF_Grid_Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WPF_Grid_Test"
    Title="MainWindow" Height="350" Width="525">
    <local:TestUserControl HorizontalAlignment="Left"/>
</Window>

UserControl.XAML

<UserControl x:Class="WPF_Grid_Test.TestUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Background="Pink" Height="100">
    <Grid Margin="0" ShowGridLines="True">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <TextBox Text="Why is WPF cropping me even though there's a huge blank space to eat into?" VerticalAlignment="Center" />
    </Grid>
</UserControl>

我尝试将所有MarginsPaddings设置为0,不做任何更改。

UserControl设置为水平居中(而不是左侧)时,行为更加怪异!而不是在右边创建一个巨大的边距,边距实际上是均匀分布的在左边和右边。我希望只有在WPF耗尽所有可用空间后才能动态调整UserControl的大小。这不是任何程序员所期望的吗?

(我的真实项目实际上有3列,分别包含TextBlock,TextBox和Button,但行为是相同的:UIElements将在WPF进入其自己生成的边距之前被裁剪)< / em>的

当我在列上设置明确的宽度(即“自动”)时,WPF会在裁剪UserControl之前正确删除其空格。但这会阻止WPF缩小UserControl,因为窗口变得更薄。

所以我的第一个问题是,这不是WPF错误吗?

我的第二个问题,如何设置列,以便WPF只在真的空间不足以显示它时才开始调整我的UserControl的大小?

这是.NET 4.0。存在类似的问题here但我并不理解解决方案。

更新 这是UserControl的另一个示例代码。当按照建议将列宽设置为“自动”时,UserControl将在窗口缩小时停止缩小其元素,并且一旦缺少空间,最终将裁剪最右边的元素:

<UserControl x:Class="WPF_Grid_Test.TestUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Background="Pink" Height="100">

    <Grid Margin="0" ShowGridLines="True">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <TextBox Text="Resize us" VerticalAlignment="Center" Grid.Column="0" />
        <TextBox Text="only when" VerticalAlignment="Center" Grid.Column="1" />
        <TextBox Text="you're out of space!" VerticalAlignment="Center" Grid.Column="2" />
    </Grid>
</UserControl>

我试图实现的行为是UserControl在缩小窗口时保留其DesiredSize。但只有当窗口空白时,UserControl才会收到“缩小”处理。

尝试从ColumnDefinitions中删除Width=Auto,您应该看到在容器缺少空间之前如何调整最右边的元素。这就是为什么我认为这确实是一个WPF布局错误。

1 个答案:

答案 0 :(得分:2)

您应该明确指定列的宽度。

例如,如果您希望两列的大小始终相同,请使用Width="*" 如果您希望两列都尽可能宽,请使用Width="Auto"。这将导致不同大小的列 如果您希望一列尽可能宽,另一列使用剩余空间,请在第一列使用Width="Auto",在第二列使用Width="*"