当焦点在其他控件上时,被调用两次
本文关键字:调用 两次 焦点 其他 控件 | 更新日期: 2023-09-27 18:02:25
当焦点被设置为TreeView SelectionChanged中的其他控件时,它再次被调用,并且TreeView的父节点也被选中。有谁能帮上忙吗?而且只有当使用焦点时,它才会重现。
<TabControl x:Name="tab">
<TabItem x:Name="tab1" Header="Item1"/>
<TabItem x:Name="tab2" Header="Item2"/>
</TabControl>
<TreeView SelectedItemChanged="TreeView_SelectedItemChanged">
<TreeViewItem Header="Header">
<TreeViewItem Header="Item1"/>
<TreeViewItem Header="Item2"/>
</TreeViewItem>
</TreeView>
这是一个简单的XAML代码
private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
tab2.Focus();
//tab.SelectedIndex = 1;
}
这里我改变了焦点
当您单击其中一个子项时,它首先选择标题,它触发您的事件,然后将焦点放回到选项卡上,实际上从未完成对子项的选择。除非您有特定的理由调用"Focus()",否则我不建议在这种情况下使用它。我认为你要做的是在选项卡控件上设置"IsSelected"属性为true。
如果你把后面的代码改成下面的,你的例子将会像你想的那样工作:
private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
tab2.IsSelected = true;
}
如果出于某种原因,您认为绝对有必要在选项卡控件上设置焦点(此时,您还没有解释为什么要这样做),您可能需要将Header上的"Focusable"属性设置为false。这样,Header就不会被选中,因此,永远不会调用SelectedItemChanged事件,如下所示:
<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<TabControl x:Name="tab">
<TabItem x:Name="tab1" Header="Item1"/>
<TabItem x:Name="tab2" Header="Item2"/>
</TabControl>
<TreeView SelectedItemChanged="TreeView_SelectedItemChanged">
<TreeViewItem Header="Header" Focusable="False">
<TreeViewItem Header="Item1"/>
<TreeViewItem Header="Item2"/>
</TreeViewItem>
</TreeView>
</StackPanel>
</Grid>
</Window>
顺便说一下,我把你的东西放在StackPanel中,这样我就可以看到标签被改变了
这有点晚了,但我遇到了同样的问题。我是这样解决的:
禁用重新启用树视图可以防止它在焦点丢失时触发SelectedChanged
private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
TreeView.IsEnabled = false;
tab2.Focus();
//tab.SelectedIndex = 1;
TreeView.IsEnabled = true;
}