我有一个TreeView,它会在每个TreeViewItems Selected事件被引发时启动一个新窗口.
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1"
Height="300"
Width="300">
<Grid>
<TreeView Name="treeView1">
<TreeViewItem Header="Root">
<TreeViewItem Header="Parent" Selected="ParentTreeViewItem_Selected">
<TreeViewItem Header="Child" Selected="TreeViewItem_Selected" ></TreeViewItem>
</TreeViewItem>
</TreeViewItem>
</TreeView>
</Grid>
</Window>
代码背后
namespace WpfApplication1
{
public partial class Window1:Window
{
public Window1()
{
的InitializeComponent();
}
private void TreeViewItem_Selected(object sender, RoutedEventArgs e)
{
Window w = new Window();
w.Show();
e.Handled = true;
}
private void ParentTreeViewItem_Selected(object sender, RoutedEventArgs e)
{
}
}
}
当我单击子节点时,将按预期启动新窗口.然而imediatly afterwords其父母选择eventis从新窗口发射窃取焦点,并将父节点标记为当前选择!
我的期望是新启动的窗口将具有焦点,并且被点击的节点将变为灰色,指示用户他/她的选择.有谁知道为什么会发生这种情况以及如何防止这种情况发生?
谢谢,
Brette
最佳答案 以为我会发布答案.我终于找到了解决这个问题的方法.设置w.Owner = this;没有效果.原来在TreeViewItem的Selected事件上启动一个新窗口会导致一些焦点问题.我没有找到根本原因是通过在Dispatcher上执行它似乎纠正它.见下文
private void ChildTreeViewItem_Selected(object sender, RoutedEventArgs e)
{
Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => new Window().Show()));
}
希望这能节省一些时间.
Brette