Шаблон заголовка GroupBox

Мой шаблон Groupbox определяется так

<Style x:Key="{x:Type GroupBox}" TargetType="{x:Type GroupBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupBox}">
                <Border BorderThickness="1" BorderBrush="SomeColour" 
                        Background="SomeColour"
                        CornerRadius="4">
                    <Grid SnapsToDevicePixels="true">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="auto" />
                            <RowDefinition Height="auto" />
                        </Grid.RowDefinitions>
                        <ContentPresenter Grid.Row="0" ContentSource="Header" 
                                          Margin="2"/>
                        <ContentPresenter Grid.Row="1"
                                          Margin="{TemplateBinding Padding}"/>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Как мне сделать так, чтобы если для заголовка была установлена ​​простая простая строка, например

<GroupBox Header="The header!" />

Текст жирный и с каким-то цветом по умолчанию?

Я пробовал следующее, но это работает только для веса, а не для цвета.

<ContentPresenter ContentSource="Header" TextBlock.Foreground="Red" 
                  TextBlock.FontWeight="Bold"/>

Изменить: вот стиль текстового блока

<Style TargetType="{x:Type TextBlock}">
        <Setter Property="Foreground" Value="{StaticResource LabelForegroundBrush}" />
        <Setter Property="Background" Value="Transparent" />
        <Setter Property="VerticalAlignment" Value="Center" />
        <Setter Property="HorizontalAlignment" Value="Stretch" />
        <Setter Property="Margin" Value="1" />

        <Style.Triggers>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Foreground" Value="{StaticResource DisabledLabelForegroundBrush}" />
            </Trigger>
        </Style.Triggers>
    </Style>

Редактировать 2: если я поместил следующее в <Window.Resources>, кажется, что это работает, но если я поместил их в <Application.Resources>, .. это не удастся???

<XXX.Resources>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Foreground" Value="Green" />
        </Style>

        <Style x:Key="{x:Type GroupBox}" TargetType="{x:Type GroupBox}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GroupBox}">
                        <Grid SnapsToDevicePixels="true">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="auto" />
                                <RowDefinition Height="auto" />
                            </Grid.RowDefinitions>
                            <ContentPresenter Grid.Row="0" ContentSource="Header" TextElement.Foreground="Red" />
                            <ContentPresenter Grid.Row="1" />
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </XXX.Resources>

Использование :

<GroupBox Header="Header">
        <Button Content="Content" />
    </GroupBox>

person pastillman    schedule 29.12.2013    source источник


Ответы (2)


Вместо этого вам нужны прикрепленные свойства TextElement.FontWeight и TextElement.Foreground.

<ContentPresenter ContentSource="Header"
                  Margin="2"
                  TextElement.FontWeight="Bold"
                  TextElement.Foreground="Red"/>


Если стиль находится в разделе Ресурсы приложения, он игнорирует передний план, установленный в ContentPresenter. Если у меня это под ресурсами Windows, все работает нормально.

Однако вы можете переопределить Style для TextBlock и установить только свойство Foreground. Также вы можете наследовать все остальные свойства от Style, объявленные в ресурсах приложения, используя BasedOn. Поместите этот стиль в ресурс ContentPresenter, чтобы он переопределялся только для вашего ContentPresenter.

Это будет работать:

<ContentPresenter Grid.Row="0" ContentSource="Header" 
                  Margin="2" TextBlock.FontWeight="Bold">
    <ContentPresenter.Resources>
       <Style TargetType="TextBlock"
              BasedOn="{StaticResource {x:Type TextBlock}}">
           <Setter Property="Foreground" Value="Red"/>
       </Style>
     </ContentPresenter.Resources>
</ContentPresenter>
person Rohit Vats    schedule 29.12.2013
comment
Кажется, это тоже не работает. Кажется, он по-прежнему улавливает цвет переднего плана, который я определил для своего шаблона TextBlock. - person pastillman; 29.12.2013
comment
Шаблон текстового блока? Можешь и это опубликовать? Насколько мне известно, TextBlock не имеет свойства Template. - person Rohit Vats; 29.12.2013
comment
Извините, я имел в виду стиль Textblock, я разместил его выше - person pastillman; 29.12.2013
comment
Все равно это не будет проблемой. Можете ли вы подтвердить, удалив Setter of Foreground из Style, если это проблема? Но я не думаю, что это будет иметь какой-либо эффект. - person Rohit Vats; 29.12.2013
comment
Если я удалю установщик переднего плана в TextBlock, это сработает, но я действительно не хочу этого делать. Я думаю, может быть, мне вообще не следует использовать неявный стиль текстового блока в моей теме? - person pastillman; 29.12.2013
comment
Я не уверен, как вы это делаете, потому что я пробовал это в небольшом приложении, и оно отлично работает для меня. - person Rohit Vats; 30.12.2013
comment
Пожалуйста, смотрите Edit2. Я тоже пробовал в небольшом приложении и заметил, что оно работает, только если я помещаю их в Windows.Resources, а не в App.Resources. Могу я спросить, где вы размещали стили? - person pastillman; 30.12.2013
comment
Да, ты прав. Я обновил свой ответ. Пожалуйста, проверьте. Вы можете переопределить значение переднего плана, не удаляя его из ресурсов приложения, и по-прежнему получать свойства, установленные в этом стиле по умолчанию. - person Rohit Vats; 30.12.2013
comment
Спасибо. Хотя почему это происходит? Почему он ведет себя по-разному при использовании в Window, а не в ресурсах приложения? - person pastillman; 30.12.2013
comment
Не совсем уверен, но мне кажется, что Resources are resolved by moving up the Visual Tree and gets resolved with first resource found while travelling up the Visual Tree. Но в вашем коде ContentPresenter i guess is not coming under Visual Tree of window since it's applied as seperate template. However, everything does fall under Application that's why style declared under application resources gets applied on it. Это мое предположение, хотя я и не уверен в этом. - person Rohit Vats; 30.12.2013

Попробуй это

 <Style x:Key="{x:Type GroupBox}" TargetType="{x:Type GroupBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GroupBox}">
                    <Border BorderThickness="1" BorderBrush="SomeColour" 
                    Background="SomeColour"
                    CornerRadius="4">
                        <Grid SnapsToDevicePixels="true">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="auto" />
                                <RowDefinition Height="auto" />
                            </Grid.RowDefinitions>
                            <TextBlock Grid.Row="0" Foreground="Red" FontWeight="Bold" Margin="2"> 
                            <ContentPresenter ContentSource="Header"/>
                            </TextBlock>
                            <ContentPresenter Grid.Row="1" Margin="{TemplateBinding Padding}"/>
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
person Heena Patil    schedule 29.12.2013
comment
Спасибо за ваше предложение, но я стараюсь избегать хаков, так как оно будет использоваться в теме. - person pastillman; 30.12.2013