WPF GroupBox ControlTemplate: как применить стиль только к элементам в заголовке? - PullRequest
3 голосов
/ 09 сентября 2010

Я пытаюсь сделать ControlTemplate для GroupBox таким, что если TextBlock объявлено в Header, его Background должно быть установлено на желтый.

Проблемаявляется то, что, хотя я определяю стиль для TextBlock s в ContentPresenter для Header, он не применяется, за исключением тех TextBlock s, которые автоматически генерируются WPF.

Вот код:

<Window
  x:Class="TestHeaderTemplate.Window1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="Window1"
  SizeToContent="WidthAndHeight">
  <Window.Resources>    
    <Style
      TargetType="{x:Type GroupBox}">
      <Setter
        Property="Template">
        <Setter.Value>
          <ControlTemplate
            TargetType="{x:Type GroupBox}">            
            <Border
              Margin="{TemplateBinding Margin}"
              BorderBrush="Black"
              BorderThickness="1">
              <StackPanel>
                <Border
                  Margin="0,0,0,5"
                  BorderThickness="5"
                  BorderBrush="LightBlue"
                  >
                  <ContentPresenter
                    ContentSource="Header">
                    <ContentPresenter.Resources>
                      <Style
                        TargetType="{x:Type TextBlock}">
                        <Setter
                          Property="Background"
                          Value="Yellow" />
                      </Style>
                    </ContentPresenter.Resources>
                  </ContentPresenter>
                </Border>
                <ContentPresenter
                  ContentSource="Content" />
              </StackPanel>
            </Border>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </Window.Resources>
  <StackPanel>
    <TextBox
      Text="All TextBoxes in a GroupBox's Header should be yellow, whether declared or autogenerated." />
    <GroupBox
      x:Name="firstGroupBox"
      Margin="5"
      Header="I am a TextBlock autogenerated by WPF. Since I'm in the Header, I should be yellow.">
        <TextBlock
          Text="I'm a TextBlock declared in the content of the GroupBox. I should NOT be yellow." />      
    </GroupBox>
    <GroupBox
      x:Name="secondGroupbox"
      Margin="5"
      >
      <HeaderedContentControl.Header>      
          <TextBlock
            x:Name="notStyledTextBlock"
            Text="I'm a TextBlock declared in the header. I should be yellow since I'm in the header."
            VerticalAlignment="Center" />          
      </HeaderedContentControl.Header>
      <TextBlock
        Text="I'm declared in the content so I should not be yellow." />
    </GroupBox>
  </StackPanel>
</Window>

Как вы можете видеть, если вы попробуете, фон TextBlock с именем notStyledTextBlock во втором GroupBox не желтый, что означает стиль, определенный в ресурсах ContentPresenter в ControlTemplate не применяется.

Удивительно, но тот, который был автоматически сгенерирован WPF в качестве контейнера для текста заголовка первого GroupBox, имеет желтый фон.

Что я могу сделать, чтобы мой стиль был применен к notStyledTextBlock TextBlock?

1 Ответ

2 голосов
/ 09 сентября 2010

У меня также были проблемы с GroupBoxes и ContentPresenter. Я отправил вопрос, и так как ответа не было, я немного исследовал себя. Посмотрите на этот ответ, возможно, это та же проблема (дополнительная информация: я не опубликовал свой реальный код проблемы, но упростил пример, который можно использовать для воспроизведения)

...