22

簡単です。ヘッダー スペースのない GroupBox が必要です。

最も近いのは境界線ですが、「デフォルトでは」境界線はグループ ボックスと同じ Style を持っていません。

目的の GroupBox を取得する最も簡単な方法 (最小の xaml/コード) は何ですか?

ありがとう

4

5 に答える 5

21

境界線が本当に必要ない場合は、次の 2 つの解決策があります。


(1) Blend でテンプレートを編集:

  • GroupBox を右クリック > テンプレートの編集 > コピーの編集 > OK
  • セクションを検索

      <Border.OpacityMask>
           <MultiBinding Converter="{StaticResource BorderGapMaskConverter}" ConverterParameter="7">
                ......
           </MultiBinding>
      </Border.OpacityMask>
    
  • この(上記の)セクションを削除します..「ギャップ」を削除しました

  • これは、ヘッダーを設定しない場合に機能します (例で示したように)。ただし、ヘッダーを設定すると、境界線の後ろに移動します。したがって、これを修正するにPanel.ZIndex="-1"は、削除したばかりのセクションを囲んでいた境界線に設定するだけです (次のようになります<Border BorderBrush="White" BorderThickness= ...) 。

(2) 複製した 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>
    
于 2010-01-21T17:33:05.797 に答える
15

境界線の角を丸くして別の色に変更することで、グループ ボックスのスタイルをエミュレートできます。以下は、GroupBox の境界線にかなり近い境界線です。

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

代替テキスト http://img264.imageshack.us/img264/6748/borderm.png

于 2010-01-21T15:19:45.580 に答える
8

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>
于 2011-01-10T14:17:56.263 に答える
0

私は同様の解決策を探していました。ヘッダー テキストがない場合にのみ境界線が閉じられるグループ ボックス スタイルが必要でした。

それが最も良い解決策であるとは確信していませんが、うまくいきます...

コンバーターがあります (テキストのみの 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
}

グループボックス スタイルへの変更:

<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>
于 2010-09-09T06:17:34.390 に答える