2015-05-19 2 views
0

Я создал пользовательский стиль TabControl для моего приложения WPF. Это включает в себя следующее Style для TabItem с:Как я могу активировать функцию 'IsSelected' из HeaderTemplate TabItem?

<Style x:Key="TabItemStyle1" TargetType="{x:Type TabItem}"> 
    <Setter Property="Padding" Value="12,2"/> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
    <Setter Property="Foreground" Value="White" /> 
    <Setter Property="FontSize" Value="14" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TabItem}"> 
       <ContentPresenter ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" ContentStringFormat="{TemplateBinding HeaderStringFormat}" ContentSource="Header" HorizontalAlignment="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ItemsControl}}}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{Binding VerticalContentAlignment, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ItemsControl}}}"/> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="Panel.ZIndex" Value="1" /> 
         <Setter Property="Foreground" Value="Orange" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

В принципе, я хочу, текст заголовка, чтобы быть размером 14 и окрашены в белый цвет, кроме случаев, когда выбран TabItem (тогда он должен быть оранжевый): Example of what the TabControl should look like

У меня возникла проблема, когда я увидел, что дочернее управление TabItem (которое не отображается на экране выше) унаследовало FontSize и Foreground. После быстрого поиска в SO я пришел к этой теме (SO: How do I set TabControls TabItem header FontSize) и решил использовать HeaderTemplate, как рекомендовал ответчик «Novitchi S». Это мой результат:

<Style x:Key="TabItemStyle1" TargetType="{x:Type TabItem}"> 
    <Setter Property="Padding" Value="12,2"/> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
    <Setter Property="HeaderTemplate"> 
     <Setter.Value> 
      <DataTemplate DataType="{x:Type TabItem}"> 
       <ContentPresenter> 
        <ContentPresenter.Content> 
         <TextBlock x:Name="ContentTextBlock" Foreground="White" FontSize="14" Text="{TemplateBinding Content}"/> 
        </ContentPresenter.Content> 
       </ContentPresenter> 
       <DataTemplate.Triggers> 
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=IsSelected}"> 
         <Setter TargetName="ContentTextBlock" Property="Foreground" Value="Orange" /> 
        </DataTrigger> 
       </DataTemplate.Triggers> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TabItem}"> 
       <ContentPresenter ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" ContentStringFormat="{TemplateBinding HeaderStringFormat}" ContentSource="Header" HorizontalAlignment="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ItemsControl}}}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{Binding VerticalContentAlignment, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ItemsControl}}}"/> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="Panel.ZIndex" Value="1" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

С положительной стороны, FontSize и Foreground теперь работает нормально. Единственное, что я не могу заставить работать, - это окрасить оранжевый цвет TextBlock, когда выбрана вкладка. Моя интуиция заключается в том, что DataTrigger либо не может найти TemplatedParent, либо TextBlock, но я застрял.

Какие варианты я должен выполнить для своей цели?

+1

Зачем использовать режим = TemplatedParent, в DataTemplate, не должны вы делать {Binding Path = propertyOfTargetElement, RelativeSource = {RelativeSource Mode = FindAncestor, AncestorType = {х: Тип typeOfTargetElement}}} – TYY

+0

@TYY Меня всегда путают со всеми типами привязок, поэтому я не придумал этого. Спасибо, что состояние 'Trigger' отлично работает. Однако цвет 'TextBlock' по-прежнему не изменится. Я сделал еще одну ошибку, или это «TextBlock» только из названия? – Physikbuddha

+0

@TYY Глупый мне, я забыл добавить 'Value =" True "' к моему 'DataTrigger'. Теперь работает безупречно! – Physikbuddha

ответ

1

Хорошо так Проблема № 1

Неправильное связывание режима, не используйте Mode=TemplatedParent, используйте

{ Binding Path=propertyOfTargetElement, 
    RelativeSource={RelativeSource Mode=FindAncestor, 
        AncestorType={x:Type typeOfTargetElement} 
       } 
} 

**

**
Что касается проблемы # 2 Я хотел бы двигаться триггер в текстовый блок. Примечание. Я не вижу цели contentpresenter в этом datatemplate, поэтому удаляю его, если только он не существует по какой-либо причине).

Я бы тогда сделать

<TextBlock> 
    <TextBlock.Style> 
      <Style.Triggers> 
       <DataTrigger 
+0

ContentPresenter оставлен из примера того, как должен выглядеть HeaderTemplate. Я удалил его сейчас, спасибо, что указал на это. :) – Physikbuddha

Смежные вопросы