在WPF应用程序中,我希望为我的groupbox实现类似的功能:
goal http://imagizer.imageshack.us/a/img829/189/15iy.png
目标是为标题创建模板,只显示左侧的内容(复选框+文本),右侧显示内容(按钮)。
不幸的是,我唯一得到的是:
what I get http://imageshack.com/a/img513/706/fiaq.png
我不想以编程方式进行,但是XAML中的所有内容(尽可能清晰)。我的意思是,使用网格,列定义等...不处理在调整窗口大小时会使所有内容崩溃的边距。
XAML我使用(网格有三列):
<GroupBox Margin="5">
<GroupBox.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="15"></ColumnDefinition>
<ColumnDefinition Width="100*"></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<CheckBox Grid.Column="0"></CheckBox>
<TextBlock Grid.Column="1" Margin="5,0,5,0" Text="This is my groupbox"></TextBlock>
<Button Content="Click" FontSize="8" Background="Yellow" Grid.Column="2" Height="16" Width="54"></Button>
</Grid>
</GroupBox.Header>
</GroupBox>
您怎么看?
答案 0 :(得分:4)
默认情况下,标题左对齐GroupBox标题。但在您的情况下,您希望几个部分保持对齐,而且很少需要覆盖ControlTemplate
的groupBox标头,如定义的here和here。
但是,您可以强制 Grid to stretch horizontally
,以便可以将按钮放在右侧。但是正如你在快照中看到的那样,边框线被标记内容隐藏起来,所以你可能得到这样的东西:
实现这一目标的相关代码将是:
<强> XAML 强>
<GroupBox Margin="5" x:Name="groupBox"
xmlns:local="clr-namespace:NamespaceOfConverter">
<GroupBox.Resources>
<local:SubtractionConverter x:Key="SubtractionConverter"/>
</GroupBox.Resources>
<GroupBox.Header>
<Grid Width="{Binding ActualWidth, ElementName=groupBox,
Converter={StaticResource SubtractionConverter}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="15"></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<CheckBox Grid.Column="0"/>
<TextBlock Grid.Column="1" Margin="5,0,5,0"
Text="This is my groupbox"/>
<Button Content="Click" FontSize="8" Background="Yellow"
HorizontalAlignment="Right" Grid.Column="2"
Height="16" Width="54"/>
</Grid>
</GroupBox.Header>
</GroupBox>
<强>转换器强>
public class SubtractionConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
return (double)value - 25.0;
}
public object ConvertBack(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
return Binding.DoNothing;
}
}