我有一组按钮,试图使宽度相同,而不是默认宽度。但是,最大宽度应该是使带有最长文本的按钮很好地显示。首先,我尝试使用a Grid并使用带有*宽度的列,但是这填满了整个窗口。建议使用UniformGrid,但结果相同。我不能只设置宽度,因为用户可以随时通过按钮设置以哪种语言显示按钮中的值。
我最终设置了一个MultiBinding,并使一切几乎可以正常使用,并且在更改语言环境时,该按钮的大小也进行了调整。我现在的问题是它不会缩小尺寸。
这是我的XAML;我在其中硬编码了文本,因此应原样复制/粘贴:
<StackPanel Orientation="Horizontal"
HorizontalAlignment="Right"
Margin="0,10,0,0">
<Button Name="DeleteBranchOkButton"
Content="Ok"
HorizontalAlignment="Left"
Padding="5">
<Button.MinWidth>
<MultiBinding Converter="{StaticResource EqualWidthConverter}">
<Binding ElementName="DeleteBranchCancelButton" Path="ActualWidth" />
</MultiBinding>
</Button.MinWidth>
</Button>
<Button Name="DeleteBranchCancelButton"
Content="Cancel"
HorizontalAlignment="Left"
Margin="10,0,0,0"
Padding="5">
<Button.MinWidth>
<MultiBinding Converter="{StaticResource EqualWidthConverter}">
<Binding ElementName="DeleteBranchOkButton" Path="ActualWidth" />
</MultiBinding>
</Button.MinWidth>
</Button>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
我的转换器实现是:
public class EqualWidthConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return Math.Abs(values.Cast<double>().Max()) < .1 ? -1 : values.Cast<double>().Max();
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
return new object[] {};
}
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是,如果更改了语言并且按钮的宽度超出了必要,则按钮的大小可以减小。我确定的一种可能的解决方案是将设置控件注入每个视图中,处理languageChanged事件,然后MinWidth在后面的代码中将属性设置为0。但是,我宁愿不这样做,除非这是唯一可能的方法。我宁愿让每个控件都不需要了解设置实现。有没有更好的方法可以做到这一点,甚至不需要转换器?
这是使用以下Grid结果的结果:

这就是我要的:

Grid.IsSharedSizeScope和SharedSizeGroup可以解救!这2个属性使您可以指定网格列/行以共享相同的宽度/高度,即使在多个网格上也是如此。
无需包装的解决方案
<Grid Grid.IsSharedSizeScope="True">
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="a"></ColumnDefinition>
<ColumnDefinition SharedSizeGroup="a"></ColumnDefinition>
<ColumnDefinition SharedSizeGroup="a"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button Grid.Column="0">New Branch</Button>
<Button Grid.Column="1">Merge</Button>
<Button Grid.Column="2">Delete Branch in French!</Button>
</Grid>
Run Code Online (Sandbox Code Playgroud)
包装解决方案
<WrapPanel Grid.IsSharedSizeScope="True">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="a"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button>New Branch</Button>
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="a"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button>Merge</Button>
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="a"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button>Delete Branch in French!</Button>
</Grid>
</WrapPanel>
Run Code Online (Sandbox Code Playgroud)