我采取的方法是检测TabItem HEADER是否被点击(忽略其他地方的点击)。
尝试1:
如果我在TabControl的XAML中连接鼠标预览事件
<TabControl PreviewMouseLeftButtonDown = "TabControl_PreviewMouseLeftButtonDown">
<TabItem>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<Image />
<TextBlock />
<TextBlock />
</StackPanel>
</TabItem.Header>
</TabItem>
<TabItem Header="etc" />
<TabItem Header="blah" />
<TabItem Header="blah" />
</TabControl>
,每次TabControl中的任何元素发生单击时,都会触发生成的事件处理程序。由于隧道/冒泡等原因,这是预期的。
但是,我想检测TabHeader区域是否发生了点击,因此我可以采取特殊措施,并忽略所有其他情况。
现在在事件处理程序
中private void TabControl_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
}
,没有参数sender,e.Source,e.OriginalSource可以肯定地说我点击了tabheader。
尝试2:
将事件的布线移动到单个TabItems而不是TabControl; 同上,没有快乐,参数发送者,来源等同样没用。
尝试3:
将事件的连线移动到TabItem中的StackPanel。
这看起来更有前途,因为预览向下事件只发生在点击标题上,这正是我想要的;但由于样式问题,有时事件不会触发; StackPanel可能不一定覆盖整个TabItem标题区域! (无论如何,我认为任何依赖造型的解决方案都会躲闪到最大程度)
我想要实现的目标是什么?
我希望在它发生之前拦截TabControl的SelectionChanged事件。即在WinForms世界中,我们可能有一些名为 TabControl_SelectionChanging 的事件。但由于在WPF /讽刺的先进现代世界中没有这样的奢侈品,我不得不求助于PreviewMouseLeftButtonDown。
如果可以通过微调上述任何一种尝试或以一种全新的方式实现这一目标,请发送创意/代码。