我有一组按钮,我试图使宽度相同,而不是默认宽度。但是,它们应该的最大宽度是使具有最长文本的按钮很好地显示。首先,我尝试使用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
结果的原因:
这就是我想要的:
答案 0 :(得分:5)
Grid.IsSharedSizeScope和SharedSizeGroup来救援!这两个属性允许您指定网格列/行以共享相同的宽度/高度,甚至跨多个网格。
无包装解决方案
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>
答案 1 :(得分:0)
您的问题有几种可能的解决方案。最简单和直接的方法是使用相同大小的Buttons
放置在布局Grid
控件中,将3个大小相等的列(使用*)和Buttons'
属性设置为默认的拉伸模式,或者将它们放入StackPanel
(根据您的样本);然后将Button's
TexBlock
封装到:
<Viewbox>
<TextBlock Text="YourText" Style="{Optional}"/>
</Viewbox>
以便很好地调整内容大小/适合内容。
希望这可能会有所帮助。