WPF 列定义自动宽度最小宽度绑定



当我写这篇文章时,我找到了一个解决方案,我将在下面解释,但为了学术练习,我想知道为什么我原来的解决方案不起作用。

我试图设置一个 3 列<Grid>其中左列和右列将根据其内容自动调整大小,但两者的宽度相同,因此较小的列将扩展以匹配较大的列。这是我尝试过的,似乎应该有效:

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Name="FlagColumn" Width="Auto" MinWidth="{Binding ActualWidth, ElementName=NumberColumn}"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Name="NumberColumn" Width="Auto" MinWidth="{Binding ActualWidth, ElementName=FlagColumn}"/>
</Grid.ColumnDefinitions>                
<TextBlock Grid.Column="0" Text="AAAA" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="BBBBBBBBBBBBB" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock Grid.Column="2" Text="CCCCCCC" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>

这导致列自动调整大小,但似乎忽略了 MinWidth 绑定,只是独立地根据自己的内容自动调整大小。

仅供参考,这就是我最终为使其工作所做的:

<Grid Grid.IsSharedSizeScope="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="Corner"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto" SharedSizeGroup="Corner"/>
</Grid.ColumnDefinitions>                
<TextBlock Grid.Column="0" Text="AAAA" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="BBBBBBBBBBBBB" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock Grid.Column="2" Text="CCCCCCC" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>

您的第一个解决方案确实通过初始化(一次性)起作用。

宽度以后不会更新(如果您更改 TextBlock 中的文本),因为ColumnDefinitionActualWidth既没有 DependencyProperty 也没有通知更改(您可以更新代码隐藏中的绑定,但此解决方案很丑陋)。

因此,如果您绑定到TextBlockActualWidth,那么您的宽度将被调整:

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Name="FlagColumn" Width="Auto" MinWidth="{Binding ActualWidth, ElementName=tb3}"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Name="NumberColumn" Width="Auto" MinWidth="{Binding ActualWidth, ElementName=tb1}"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="tb1"  Grid.Column="0" Text="AAAA" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="BBBBBBBBBBBBB" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock x:Name="tb3" Grid.Column="2" Text="CCCCCCC" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>

此外,如果列中的文本更短Auto-size 小于以前值设置的MinWidth,您的侧列不会缩小,因此新宽度只会增加。

您的第一种方法效果很好。像这样测试并工作:

<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Name="FlagColumn" Width="Auto" MinWidth="{Binding ActualWidth, ElementName=NumberColumn}"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Name="NumberColumn" Width="Auto" MinWidth="{Binding ActualWidth, ElementName=FlagColumn}"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="AAAA" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="BBBBBBBBBBBBB" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock Grid.Column="2" Text="CCCCCCCCCCCCCCCCC" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>

第一列和第三列为 126.31,中间列为 531.38

最新更新