1

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

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

主窗口.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>

用户控件.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>

我尝试将所有Margins和设置Paddings为0,没有变化。

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

(我的真实项目实际上有 3 列,分别包含一个 TextBlock、一个 TextBox 和一个 Button,但行为是相同的:UIElements 将在 WPF 吃进它自己的自动生成的边距之前被裁剪)

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

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

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

这是.NET 4.0。这里存在一个类似的问题,但我并不真正理解解决方案。

更新: 这是另一个示例代码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 布局错误。

4

1 回答 1

2

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

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

于 2012-10-12T15:23:46.067 回答