WPF, как стилизовать TabItem на основе свойства TabControl? - PullRequest
0 голосов
/ 28 февраля 2020

Я хочу добиться аналогичного эффекта, который можно увидеть в Notepad ++: разделить TabContol на два TabControls. Очевидно, что обе будут выбирать вкладку самостоятельно, но все равно будет активна только одна из них.

Для тех, кто не знает Notepad ++, это выглядит так:

Notepad++

Для этого мне нужно будет ввести свойство «Active» в TabControl ( не Focused, потому что, когда один из TabControls теряет фокус, его выбранная вкладка по-прежнему остается активный). Однако я не знаю, как создать триггер на ControlTemplate TabItem, который позволит мне различать guish выделенный и выбранный + активную вкладку.

Вот так выглядит мой текущий шаблон TabItem:

<Style x:Key="BaseRootTabItem" TargetType="TabItem">
    <Style.Setters>
        <Setter Property="Background" Value="{StaticResource NormalTabBackgroundBrush}" />
        <Setter Property="TextBlock.Foreground" Value="{StaticResource NormalTabForegroundBrush}" />
    </Style.Setters>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Trigger.Setters>
                <Setter Property="Background" Value="{StaticResource HoverTabBackgroundBrush}" />
                <Setter Property="TextBlock.Foreground" Value="{StaticResource HoverTabForegroundBrush}" />
            </Trigger.Setters>
        </Trigger>
    </Style.Triggers>
</Style>

<Style x:Key="DocumentTabItem" TargetType="TabItem" BasedOn="{StaticResource BaseRootTabItem}">
    <Style.Setters>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TabItem">
                    <Border x:Name="TabBorder" BorderThickness="1,1,1,0" BorderBrush="Transparent"
                                            Background="{TemplateBinding Background}" TextBlock.Foreground="{TemplateBinding Foreground}">
                        <ContentPresenter x:Name="ContentSite" HorizontalAlignment="Center" VerticalAlignment="Center" ContentSource="Header" Margin="6,2" />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style.Setters>
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Trigger.Setters>
                <Setter Property="Background" Value="{StaticResource SelectedDocumentTabBackgroundBrush}" />
                <Setter Property="Foreground" Value="{StaticResource SelectedDocumentTabForegroundBrush}" />
            </Trigger.Setters>
        </Trigger>
    </Style.Triggers>
</Style>

Мне нужно что-то вроде:

<Trigger Property="(Owning TabControlEx's Active property)" Value="True">
    <Trigger.Setters>
    ...
    </Trigger.Setters>
</Trigger>

Или, может быть, есть какое-то другое решение?

1 Ответ

1 голос
/ 28 февраля 2020

Поскольку свойство Active не принадлежит TabItem, Trigger не будет работать. Используйте DataTrigger с привязкой к родителю:

<DataTrigger Binding="{Binding Active, RelativeSource={RelativeSource AncestorType=TabControlEx}}" 
             Value="True">
</DataTrigger>
...