WPF,如何根据TabControl的属性设置TabItem的样式?

问题描述 投票:0回答:1

我想实现类似的效果,在Notepad ++中可以看到:将TabContol分为两个TabControl。显然,两个都将单独选择选项卡,但是仍然只有其中一个处于活动状态。

对于那些不了解Notepad ++的人,它是这样的:

Notepad++

为此,我需要在TabControl上引入“ Active”属性(not Focused,因为当TabControls之一失去焦点时,其选定的选项卡仍保持活动状态)。但是,我不知道如何在TabItem的ControlTemplate上制作触发器,这将使我能够区分选择的和选择的+活动选项卡。

这是我当前的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>

或者也许还有其他解决方案?

c# wpf triggers tabcontrol wpf-style
1个回答
0
投票

由于Active属性不属于TabItem,因此触发器将不起作用。使用DataTrigger绑定到父项:

<DataTrigger Binding="{Binding Active, RelativeSource={RelativeSource AncestorType=TabControlEx}}" 
             Value="True">
</DataTrigger>
© www.soinside.com 2019 - 2024. All rights reserved.