当焦点在其他控件上时,被调用两次

本文关键字:调用 两次 焦点 其他 控件 | 更新日期: 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;
}