1 <Style x:Key="CenterHeaderGroupBoxStyle" TargetType="{x:Type GroupBox}">
2 <Setter Property="BorderBrush" Value="#FFAEAEAE"/>
3 <Setter Property="BorderThickness" Value="1"/>
4 <Setter Property="Template">
5 <Setter.Value>
6 <ControlTemplate TargetType="{x:Type GroupBox}">
7 <Grid SnapsToDevicePixels="true">
8 <Grid.ColumnDefinitions>
9 <ColumnDefinition Width="4"/>
10 <ColumnDefinition Width="*"/>
11 <ColumnDefinition Width="Auto"/>
12 <ColumnDefinition Width="*" />
13 <ColumnDefinition Width="4"/>
14 </Grid.ColumnDefinitions>
15 <Grid.RowDefinitions>
16 <RowDefinition Height="Auto"/>
17 <RowDefinition Height="Auto"/>
18 <RowDefinition Height="*"/>
19 <RowDefinition Height="4"/>
20 </Grid.RowDefinitions>
21 <!--外边框-->
22 <Border Grid.Row="1" Grid.Column="0" Grid.RowSpan="3" Grid.ColumnSpan="5"
23 CornerRadius="4" BorderBrush="Transparent"
24 BorderThickness="{TemplateBinding BorderThickness}"
25 Background="{TemplateBinding Background}"/>
26 <!--Header-->
27 <Border Grid.Row="0" Grid.Column="2" Grid.RowSpan="2"
28 x:Name="Header" Padding="3,1,3,0">
29 <ContentPresenter ContentSource="Header" RecognizesAccessKey="True"
30 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
31 </Border>
32 <!--内容-->
33 <ContentPresenter Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3"
34 Margin="{TemplateBinding Padding}"
35 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
36 <!--外边框样式,设置不透明蒙板,隐藏串过header的border边线-->
37 <Border Grid.Row="1" Grid.Column="0" Grid.RowSpan="3" Grid.ColumnSpan="5"
38 CornerRadius="4" BorderBrush="White"
39 BorderThickness="{TemplateBinding BorderThickness}">
40 <Border.OpacityMask>
41 <MultiBinding Converter="{StaticResource CenterBorderGapMaskConverter}">
42 <Binding ElementName="Header" Path="ActualWidth"/>
43 <Binding RelativeSource="{RelativeSource Self}" Path="ActualWidth"/>
44 <Binding RelativeSource="{RelativeSource Self}" Path="ActualHeight"/>
45 </MultiBinding>
46 </Border.OpacityMask>
47 <Border BorderThickness="{TemplateBinding BorderThickness}"
48 BorderBrush="{TemplateBinding BorderBrush}"
49 CornerRadius="3">
50 <Border BorderThickness="{TemplateBinding BorderThickness}"
51 BorderBrush="White"
52 CornerRadius="2"/>
53 </Border>
54 </Border>
55 </Grid>
56 </ControlTemplate>
57 </Setter.Value>
58 </Setter>
59 </Style>
Headrt部分背景显示设置:Opacity是设置透明的,OpacityMask是个透明遮罩,就相当于在背景上再加了一层。用来改变背景的透明度。groupbox默认实现类为BorderGapMaskConverter,此处要居中,重定义器边框透明样式。
CenterBorderGapMaskConverter实现
1 //BorderGapMaskConverter
2 internal class CenterBorderGapMaskConverter : IMultiValueConverter
4 public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
6 Type type = typeof(double);
7 if (values == null
8 || values.Length != 3
9 || values[0] == null
10 || values[1] == null
11 || values[2] == null
12 || !type.IsAssignableFrom(values[0].GetType())
13 || !type.IsAssignableFrom(values[1].GetType())
14 || !type.IsAssignableFrom(values[2].GetType()))
15 {
16 return DependencyProperty.UnsetValue;
17 }
19 double pixels = (double)values[0];
20 double width = (double)values[1];
21 double height = (double)values[2];
22 if ((width == 0.0) || (height == 0.0))
23 {
24 return null;
25 }
26 Grid visual = new Grid();
27 visual.Width = width;
28 visual.Height = height;
29 ColumnDefinition colDefinition1 = new ColumnDefinition();
30 ColumnDefinition colDefinition2 = new ColumnDefinition();
31 ColumnDefinition colDefinition3 = new ColumnDefinition();
32 colDefinition1.Width = new GridLength(1.0, GridUnitType.Star);
33 colDefinition2.Width = new GridLength(pixels);
34 colDefinition3.Width = new GridLength(1.0, GridUnitType.Star);
35 visual.ColumnDefinitions.Add(colDefinition1);
36 visual.ColumnDefinitions.Add(colDefinition2);
37 visual.ColumnDefinitions.Add(colDefinition3);
38 RowDefinition rowDefinition1 = new RowDefinition();
39 RowDefinition rowDefinition2 = new RowDefinition();
40 rowDefinition1.Height = new GridLength(height / 2.0);
41 rowDefinition2.Height = new GridLength(1.0, GridUnitType.Star);
42 visual.RowDefinitions.Add(rowDefinition1);
43 visual.RowDefinitions.Add(rowDefinition2);
44 Rectangle rectangle1 = new Rectangle();
45 Rectangle rectangle2 = new Rectangle();
46 Rectangle rectangle3 = new Rectangle();
47 rectangle1.Fill = Brushes.Black;
48 rectangle2.Fill = Brushes.Black;
49 rectangle3.Fill = Brushes.Black;
50 Grid.SetRowSpan(rectangle1, 2);
51 Grid.SetRow(rectangle1, 0);
52 Grid.SetColumn(rectangle1, 0);
53 Grid.SetRow(rectangle2, 1);
54 Grid.SetColumn(rectangle2, 1);
55 Grid.SetRowSpan(rectangle3, 2);
56 Grid.SetRow(rectangle3, 0);
57 Grid.SetColumn(rectangle3, 2);
58 visual.Children.Add(rectangle1);
59 visual.Children.Add(rectangle2);
60 visual.Children.Add(rectangle3);
61 return new VisualBrush(visual);
62 }
64 public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
65 {
66 return new object[] { Binding.DoNothing };
67 }
1 <GroupBox Header="表头居中" Grid.Row="0" Grid.Column="1" Grid.RowSpan="2" Margin="2"
2 Style="{StaticResource CenterHeaderGroupBoxStyle}">
3 </GroupBox>
参考
WPF GroupBox Header Customization - Stack Overflow
How to: Define a GroupBox Template - WPF .NET Framework | Microsoft Docs