我有一个应用程序,该应用程序要根据用户是显式单击选项卡还是通过设置hSelectedIndex通过代码激活选项卡来将焦点明确设置到TabItem内容内的特定内容。具体来说,我不想以编程方式选择时将焦点设置到嵌入式文档的内容上(因为我可以通过代码显式地对其进行强制设置),但是当通过Tab标头单击激活时,我不想设置它。
我无法有效拦截制表符标题单击操作。选项卡和选项卡内容容器的点击似乎不会触发,并且在SelectedIndex_Changed事件内部没有迹象表明激活源自何处。
有什么想法可以用来确定明确的手动还是程序化选项卡激活?
答案 0 :(得分:0)
我对此有一个解决方案。您可以在选项卡标题上捕获鼠标单击事件并设置一个布尔标志。然后在选项卡控件的“ SelectionChanged”事件中检查相同的标志,您可以在此处进行此类设置焦点的操作,然后重置标志以标识进一步的点击。这是示例代码。
<TabControl SelectionChanged="TabControl_SelectionChanged">
<TabItem>
<TabItem.Header>
<TextBlock Text="ABC" MouseDown="TextBlock_MouseDown"/>
</TabItem.Header>
<!--<TabItem.InputBindings>
<MouseBinding Gesture="LeftClick" />
</TabItem.InputBindings>-->
</TabItem>
<TabItem Header="XYZ" />
</TabControl>
在后面的代码中,您可以像这样检查
private void TabControl_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
if(isClicked)
{
//you can set focus here
isClicked = false;
}
}
private void TextBlock_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
isClicked = true;
}
如果要设置变量或采取任何必要的操作,也可以尝试使用选项卡项目的输入绑定来检测鼠标单击并引发命令。如果您关注MVVM,这种方法将很有用