我有一个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。
这是标签
的样子 <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>
答案 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
样式