我有一个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
答案 0 :(得分:2)
以为我会发布答案。我终于找到了解决这个问题的方法。设置w.Owner = this;没有效果。原来在TreeViewItem的Selected事件上启动一个新窗口会导致一些焦点问题。我没有找到根本原因是通过在Dispatcher上执行它似乎纠正它。见下文
private void ChildTreeViewItem_Selected(object sender, RoutedEventArgs e)
{
Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => new Window().Show()));
}
希望这能节省一些时间。
Brette
答案 1 :(得分:0)
添加:
w.Owner = this
示例:
private void TreeViewItem_Selected(object sender, RoutedEventArgs e)
{
Window w = new Window();
w.Owner = this;
w.Show();
e.Handled = true;
}