父TreeView项目鬼选事件!

时间:2009-08-21 20:43:40

标签: wpf wpf-controls

我有一个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

2 个答案:

答案 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;
}