TabItem标题看起来与标签不同

时间:2016-11-28 17:57:39

标签: wpf tabitem

我有一个TabItem,之前在对象中设置了Header,就像这样,

<TabItem x:Name="Checked_Out_Items" Header="Clients In Use" Height="40" LostFocus="Checked_Out_Items_LostFocus" GotFocus="Checked_Out_Items_GotFocus" BorderThickness="0" >

但是,我遇到了此选项卡没有Click事件的问题。我找到了一个解决方案,我们可以插入标签作为此处指定的标头, how to handle TabItem single click event in WPF?

但是,标签看起来不像我需要的东西。这是在对象内定义的Tab Header。 enter image description here

这是标签

的样子
        <TabItem x:Name="Checked_Out_Items" Height="40" LostFocus="Checked_Out_Items_LostFocus" GotFocus="Checked_Out_Items_GotFocus" BorderThickness="0" >
            <TabItem.Header>
                <Label Content="Clients In Use" Height="40" MouseLeftButtonDown="Checked_Out_Items_Clicked" Width="171" />
            </TabItem.Header>

enter image description here

1 个答案:

答案 0 :(得分:2)

让我们稍微分开一下。

为了处理鼠标单击事件,需要为接收此事件准备一个控件,它需要实现一个处理程序,并且处理程序必须实际接收该事件。如果TabItem,控件将使用鼠标单击事件,而不会将事件释放给用户定义的侦听器。

TabItem级别,最好的选择是处理PreviewMouseLeftButtonDown事件,但如果子控件具有自己的处理功能时不应发生事件处理,则不能选择此选项。

所以另一个选择是在MouseLeftButtonDown事件到达TabItem之前处理它,这意味着在标签项的子控件中处理它。

如上所述,为了接收事件,控件需要准备好接收事件。这意味着,它需要Background而不是null(可以是Transparent)和IsHitTestEnabled="True"(在大多数情况下是默认值),它必须实际处理事件。

对于展示广告,我使用Red代替Transparent背景色。红色区域是捕获和处理鼠标点击的地方。

<TabItem Padding="0">
    <TabItem.Header>
        <Border Height="30" Width="50"
                Background="Red" MouseLeftButtonDown="Item_MouseLeftButtonDown">
            <ContentPresenter
                VerticalAlignment="Center" HorizontalAlignment="Center"
                Content="T2"/>
        </Border>
    </TabItem.Header>
    Test Content 2
</TabItem>

或者,为了在标题内容和点击处理之间实现更好的分离,可以使用HeaderTemplate

<TabItem Header="T3" Padding="0">
    <TabItem.HeaderTemplate>
        <DataTemplate>
            <Border MinHeight="30" MinWidth="50"
                    Background="Red" MouseLeftButtonDown="Item_MouseLeftButtonDown">
                <ContentPresenter
                    VerticalAlignment="Center" HorizontalAlignment="Center"
                    Content="{Binding}"/>
            </Border>
        </DataTemplate>
    </TabItem.HeaderTemplate>
    Test Content 3
</TabItem>

依赖于子控件的任何方法的问题是,TabItem仍有边框,如果用户单击该边框,则单击将位于子控件之外,选项卡将为选择时不执行点击处理程序。

因此,处理标签更改(而不是点击!)的另一种方法是处理TabControl.SelectionChanged事件,并过滤实际来自TabControl而非某些内部内容元素的事件。< / p>

private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (e.Source == sender)
    {
        // this selection change is actually issued because of a tab change
    }
}

我刚刚意识到的另一件事:可以在TabItem.PreviewMouseLeftButtonDown中使用相同的条件,以便过滤来自内容区域的tabitem标头与点击事件的点击次数。

编辑:

Label看起来与众不同的原因是,TabItem的字体样式处于活动状态,Label使用了某些内部样式,忽略了TabItem样式