使按钮具有相同的宽度

Hos*_*250 1 c# wpf xaml

我有一组按钮,试图使宽度相同,而不是默认宽度。但是,最大宽度应该是使带有最长文本的按钮很好地显示。首先,我尝试使用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结果的结果:

不良图片

这就是我要的:

漂亮的形象

Tre*_*ree 5

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)

在此处输入图片说明

在此处输入图片说明