【问题标题】:When I change GroupBox style, GroupBox header property becomes hidden?当我更改 GroupBox 样式时,GroupBox 标题属性变为隐藏?
【发布时间】:2021-01-29 20:35:17
【问题描述】:

我想更改GroupBox 样式,但是当我这样做时,我无法显示GroupBox 标头并且Groupbox 标头被隐藏。 我想要一个与下图完全一样的 GroupBox:

https://pasteboard.co/JLWHAHL.jpg

具有以下属性:

CornerRadius="9" BorderBrush="DarkGray" BorderThickness="1" 页眉 location=在 GroupBox 边框的顶部

我尝试了以下代码,但没有成功:

 <GroupBox x:Name="Search_GroupBox" Header="Search"  HorizontalAlignment="Left" VerticalAlignment="Top" Margin="295,64,0,0" Width="277" Height="70">
    <GroupBox.Style>
        <Style  TargetType="{x:Type GroupBox}">
            <Setter Property="OverridesDefaultStyle" Value="True"/>
            <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GroupBox}">
                        <Border CornerRadius="9" BorderBrush="DarkGray" BorderThickness="1"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="HeaderTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <Border Canvas.ZIndex="2" BorderBrush="Black" BorderThickness="1" CornerRadius="3" HorizontalAlignment="Stretch" Width="70" Margin="-2,0,-3,-1" Height="20">
                            <TextBlock Text="Search" Foreground="Black" FontWeight="DemiBold" HorizontalAlignment="Center" />
                        </Border>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </GroupBox.Style>
 </GroupBox>

【问题讨论】:

  • 请注意图片链接已失效,请尝试更新。

标签: wpf xaml


【解决方案1】:

您需要在样式中包含ContentPresenter 元素,以便同时显示Header 内容和GroupBox 内容本身。

所以,你的风格应该更像这样:

<GroupBox x:Name="Search_GroupBox" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="295,64,0,0" Width="277" Height="70">
    <GroupBox.Style>
        <Style  TargetType="{x:Type GroupBox}">
            <Setter Property="OverridesDefaultStyle" Value="True"/>
            <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GroupBox}">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <Border x:Name="Header" Padding="3,1,3,0" HorizontalAlignment="Left">
                                <ContentPresenter ContentSource="Header" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </Border>
                            <Border CornerRadius="9" BorderBrush="DarkGray" BorderThickness="1" Grid.Row="1">
                                <ContentPresenter Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </Border>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="HeaderTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <Border Canvas.ZIndex="2" BorderBrush="Black" BorderThickness="1" CornerRadius="3" HorizontalAlignment="Stretch" Width="70" Margin="-2,0,-3,-1" Height="20">
                            <TextBlock Text="Search" Foreground="Black" FontWeight="DemiBold" HorizontalAlignment="Center" />
                        </Border>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </GroupBox.Style>
</GroupBox>

但是,作为一种更好的方法,建议编辑 GroupBox 控件的原始样式的副本,将 ContentPresenters 保留在原处。

更新

与您附加的image 中的样式相似的样式需要在GroupBox 控件的默认Template 中进行简单的编辑。

它的棘手之处在于CornerRadius 属性,这就是我们要覆盖默认样式并对其进行编辑的原因:

<GroupBox Header="Search" Height="70">
    <GroupBox.Style>
        <Style TargetType="{x:Type GroupBox}">
            <Setter Property="BorderBrush" Value="DarkGray"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GroupBox}">
                        <Grid SnapsToDevicePixels="true">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="10"/>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="10"/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="10"/>
                            </Grid.RowDefinitions>
                            
                            <Border BorderBrush="Transparent" 
                                    BorderThickness="{TemplateBinding BorderThickness}" 
                                    Background="{TemplateBinding Background}" 
                                    Grid.ColumnSpan="4" Grid.Column="0" 
                                    CornerRadius="11" Grid.Row="1" Grid.RowSpan="3"/>
                            
                            <Border BorderBrush="White" 
                                    BorderThickness="{TemplateBinding BorderThickness}" 
                                    Grid.ColumnSpan="4" 
                                    CornerRadius="11" Grid.Row="1" Grid.RowSpan="3">
                                <Border.OpacityMask>
                                    <MultiBinding ConverterParameter="10">
                                        <MultiBinding.Converter>
                                            <BorderGapMaskConverter/>
                                        </MultiBinding.Converter>
                                        <Binding ElementName="Header" Path="ActualWidth"/>
                                        <Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}"/>
                                        <Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}"/>
                                    </MultiBinding>
                                </Border.OpacityMask>
                                
                                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="10">
                                    <Border BorderBrush="White" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="9"/>
                                </Border>
                            </Border>
                            
                            <Border x:Name="Header" Grid.Column="1" Padding="3,1,3,0" Grid.Row="0" Grid.RowSpan="2">
                                <ContentPresenter ContentSource="Header"
                                                  RecognizesAccessKey="True" 
                                                  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </Border>
                            
                            <ContentPresenter Grid.ColumnSpan="2" Grid.Column="1" Grid.Row="2" 
                                              Margin="{TemplateBinding Padding}"
                                              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </GroupBox.Style>
    
    <!-- Place your content here... -->
    
</GroupBox>

【讨论】:

  • 请看上面GroupBox图片的链接。
  • @reza_jafery 您希望哪个边框的 CornerRadius 为 9、标题或 GroupBox 内容?
  • GroupBox 内容 CornerRadius=9 和 GroupBox Header=无边框
  • 非常感谢您的回复,但是当我放上StackPanel时,GroupBox本身就完全变成隐藏了。
  • @reza_jafery 我已经更新了我的答案,看看吧。
猜你喜欢
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多