当焦点转移到其他控件时,TreeView selectionChanged调用两次

时间:2014-05-09 06:57:10

标签: c# wpf treeview

当在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;
}

我改变了焦点。

1 个答案:

答案 0 :(得分: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中,这样我就可以看到Tab变了。