这是一个包含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>
我尝试将所有Margins
和Paddings
设置为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布局错误。
答案 0 :(得分:2)
您应该明确指定列的宽度。
例如,如果您希望两列的大小始终相同,请使用Width="*"
如果您希望两列都尽可能宽,请使用Width="Auto"
。这将导致不同大小的列
如果您希望一列尽可能宽,另一列使用剩余空间,请在第一列使用Width="Auto"
,在第二列使用Width="*"
。