代码之家  ›  专栏  ›  技术社区  ›  PBelanger

没有标题空间的WPF GroupBox

  •  19
  • PBelanger  · 技术社区  · 16 年前

    简单一点,我想要一个没有标题空间的GroupBox

    最接近的是边框,但边框“默认”与分组框的样式不同。

    获取所需GroupBox的最简单方法(最少xaml/代码)是什么?

    谢谢

    5 回复  |  直到 6 年前
        1
  •  21
  •   mg007    16 年前

    如果您确实不想要边界,那么可以有以下两种解决方案:


    • 右键单击GroupBox>编辑模板>编辑副本>好啊
    • 搜索部分

        <Border.OpacityMask>
             <MultiBinding Converter="{StaticResource BorderGapMaskConverter}" ConverterParameter="7">
                  ......
             </MultiBinding>
        </Border.OpacityMask>
      
    • 删除此(上述)部分。。您刚刚消除了“间隙”

    • Panel.ZIndex="-1" 在您刚才删除的部分的边框中(看起来像 <Border BorderBrush="White" BorderThickness= ... )

    (2) 使用重复的GroupBox并水平翻转它,然后将其放置在原始GroupBox下面:

    • 将此代码放在groupbox下面(假设groupbox的名称为' OriginalGroupbox ')

       <GroupBox Header="" Focusable="False" Panel.ZIndex="-1" 
                 Width="{Binding ActualWidth, ElementName=OriginalGroupbox}" 
                 Height="{Binding ActualHeight, ElementName=OriginalGroupbox}" 
                 IsEnabled="{Binding IsEnabled, ElementName=OriginalGroupbox}"
                 RenderTransformOrigin="0.5,0.5">
                 <GroupBox.RenderTransform>
                      <ScaleTransform ScaleX="-1"/>
                 </GroupBox.RenderTransform>
       </GroupBox>
      
    • 将这两个GroupBox都包含在 Grid 这样地:

      <Grid>
           <GroupBox x:Name="OriginalGroupbox" Header="Mihir" ...>
              ...
           </GroupBox>
           <GroupBox Header="" Width="{Binding ActualWidth, ElementName=OriginalGroupbox}" ...>
              ...
           </GroupBox>
      </Grid>
      
        2
  •  15
  •   Disillusioned    10 年前

    <Border BorderThickness="1" CornerRadius="4" Height="100" Width="100" Padding="5" BorderBrush="LightGray"><TextBlock>Border</TextBlock></Border>
    

    alt text http://img264.imageshack.us/img264/6748/borderm.png

        3
  •  8
  •   Locdarb    15 年前

    基于Mihir Gokani的答案,您可以将默认模板更改为使用触发器,在标头为null或空时将标头的填充更改为空。

    在GroupBox上使用以下样式,应将其修复。

    <BorderGapMaskConverter x:Key="BorderGapMaskConverter"/>
    <Style x:Key="GroupBoxStyle" TargetType="{x:Type GroupBox}">
        <Setter Property="BorderBrush" Value="#D5DFE5"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GroupBox}">
                    <Grid SnapsToDevicePixels="true">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="6"/>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="6"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="6"/>
                        </Grid.RowDefinitions>
                        <Border BorderBrush="Transparent" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.ColumnSpan="4" Grid.Column="0" CornerRadius="4" Grid.Row="1" Grid.RowSpan="3"/>
                        <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" Margin="{TemplateBinding Padding}" Grid.Row="2" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        <Border BorderBrush="White" BorderThickness="{TemplateBinding BorderThickness}" Grid.ColumnSpan="4" CornerRadius="4" Grid.Row="1" Grid.RowSpan="3">
                            <Border.OpacityMask>
                                <MultiBinding ConverterParameter="7" Converter="{StaticResource BorderGapMaskConverter}">
                                    <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="3">
                                <Border BorderBrush="White" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2"/>
                            </Border>
                        </Border>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="Header" Value="{x:Null}">
                            <Setter TargetName="Header" Property="Padding" Value="0" />                                 
                        </Trigger>
                            <Trigger Property="Header" Value="">
                                <Setter TargetName="Header" Property="Padding" Value="0" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    

    注:唯一的补充是:

    <ControlTemplate.Triggers>
        <Trigger Property="Header" Value="{x:Null}">
            <Setter TargetName="Header" Property="Padding" Value="0" />                                 
        </Trigger>
        <Trigger Property="Header" Value="">
            <Setter TargetName="Header" Property="Padding" Value="0" />
        </Trigger>
    </ControlTemplate.Triggers>
    
        4
  •  0
  •   LukeN    16 年前

    我在寻找类似的解决方案。我需要一个组框样式,只有在没有标题文本时才关闭边框。

    我不相信这是最好的解决方案,但效果很好。。。

    我们有一个转换器(仅适用于文本atm):

    public class GroupBoxHeaderVisibilityConverter : IMultiValueConverter
    {
        #region IMultiValueConverter Members
    
        public object Convert(object[] values, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            ContentPresenter header = values[0] as ContentPresenter;
            if (header != null)
            {
                string text = header.Content as string;
                if (string.IsNullOrEmpty(text))
                {
                    return 0.0;
                }
            }
            return values[1];
        }
    
        public object[] ConvertBack(object value, System.Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new System.NotImplementedException();
        }
    
        #endregion
    }
    

    以及对groupbox样式的修改:

    <Border
        x:Name="Header"
        Grid.Column="1"
        Grid.Row="0"
        Grid.RowSpan="2"
        Padding="3,1,3,0">
        <Border.Tag>
            <MultiBinding Converter="{StaticResource GroupBoxHeaderVisibilityConverter}">
                <Binding Path="Content" ElementName="groupBoxLabel" />
                <Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}" />
            </MultiBinding> 
        </Border.Tag>
        <Label x:Name="groupBoxLabel"
            FontSize="{StaticResource Fonts_SmallFontSize}"
            Foreground="{TemplateBinding Foreground}">
            <ContentPresenter
                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                ContentSource="Header"
                RecognizesAccessKey="True" />
        </Label>
    </Border>
    <ContentPresenter
        Margin="{TemplateBinding Padding}"
        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
        Grid.Column="1"
        Grid.ColumnSpan="2"
        Grid.Row="2" />
    <Border
        Grid.ColumnSpan="4"
        Grid.Row="1"
        Grid.RowSpan="3"
        BorderBrush="Transparent"
        BorderThickness="{TemplateBinding BorderThickness}"
        CornerRadius="4">
        <Border.OpacityMask>                                
            <MultiBinding
                Converter="{StaticResource BorderGapMaskConverter}"
                ConverterParameter="7">
                <Binding ElementName="Header" Path="Tag" />
                <Binding
                    Path="ActualWidth"
                    RelativeSource="{RelativeSource Self}" />
                <Binding
                    Path="ActualHeight"
                    RelativeSource="{RelativeSource Self}" />
            </MultiBinding>
        </Border.OpacityMask>
        <Border
            BorderBrush="{TemplateBinding BorderBrush}"
            BorderThickness="{TemplateBinding BorderThickness}"
            CornerRadius="3" />
    </Border>
    
        5
  •  0
  •   Chris    12 年前

    <UserControl.Resources>
        <ResourceDictionary>
            <BorderGapMaskConverter x:Key="BorderGapMaskConverter"/>
        <Style x:Key="GroupBoxStyle1" TargetType="{x:Type GroupBox}">
            <Setter Property="BorderBrush" Value="#D5DFE5"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GroupBox}">
                        <Grid SnapsToDevicePixels="true">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="6"/>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="6"/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="6"/>
                            </Grid.RowDefinitions>
                            <Border BorderBrush="Transparent" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.ColumnSpan="4" Grid.Column="0" CornerRadius="4" Grid.Row="1" Grid.RowSpan="3"/>
                            <Border BorderBrush="White" BorderThickness="{TemplateBinding BorderThickness}" Grid.ColumnSpan="4" CornerRadius="4" Grid.Row="1" Grid.RowSpan="3">
    
                                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3">
                                    <Border BorderBrush="White" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2"/>
                                </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" Margin="{TemplateBinding Padding}" Grid.Row="2" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
            </ResourceDictionary>
    </UserControl.Resources>
    
    <Grid>
    
        <GroupBox Header="" HorizontalAlignment="Left" Margin="70,39,0,0" VerticalAlignment="Top" Height="169.96" Width="299.697" Style="{DynamicResource GroupBoxStyle1}"/>
    </Grid>