当在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;
}
我改变了焦点。
答案 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变了。