使按钮宽度相同

时间:2016-02-28 00:32:15

标签: c# wpf xaml

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

我的转换器实现是:

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[] {};
    }
}

现在的问题是,如果更改语言并且按钮宽度超出必要范围,则允许按钮调整大小。我发现的一个可能的解决方案是将设置控件注入每个视图,处理languageChanged事件,并在后面的代码中将MinWidth属性设置为0。但是,我宁愿不这样做,除非它是唯一可行的方法;我宁愿让每个控件都不需要了解设置实现。有没有更好的方法来做到这一点,甚至可能甚至不需要转换器?

这是使用Grid结果的原因:

Bad Image

这就是我想要的:

Nice Image

2 个答案:

答案 0 :(得分:5)

Grid.IsSharedSizeScopeSharedSizeGroup来救援!这两个属性允许您指定网格列/行以共享相同的宽度/高度,甚至跨多个网格。

无包装解决方案

ggplot(data=draft1, aes(x = Round, y = mean.age)) + 
geom_bar(stat = "identity", fill = "steelblue", color = "black", width = 0.7) +
ylab("Average age of retirement") +   ylim(c(0,40)) + 
ggtitle("Average age of retirement by rounds of all players") +
geom_text(aes(label = mean.age), position=position_dodge(width=0.9), vjust = -0.5)

包装解决方案

<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>

enter image description here

enter image description here

答案 1 :(得分:0)

您的问题有几种可能的解决方案。最简单和直接的方法是使用相同大小的Buttons放置在布局Grid控件中,将3个大小相等的列(使用*)和Buttons'属性设置为默认的拉伸模式,或者将它们放入StackPanel(根据您的样本);然后将Button's TexBlock封装到:

<Viewbox>
   <TextBlock Text="YourText" Style="{Optional}"/>
</Viewbox>

以便很好地调整内容大小/适合内容。

希望这可能会有所帮助。