2009-08-21 88 views
4

我有一個TreeView,當它的每個TreeViewItems Selected事件被引發時,它會啓動一個新窗口。Parent TreeView項目鬼選定的事件!

<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 

{ 公共部分類窗口1:窗口 { 公共窗口1() { 的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) 
    { 

    } 
} 

}

當我點擊如預期的那樣推出新窗口中的子節點上。然而,它的父母選中的事件的後綴卻是從新窗口中開始竊取焦點,並將父節點標記爲當前選擇!

我的期望是新推出的窗口將有焦點,並且被點擊的節點會變成灰色,向用戶顯示他/她的選擇。有沒有人有任何想法,爲什麼發生這種情況,我如何能夠防止它?

感謝, Brette

回答

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

+0

從ViewModel的IsSelected屬性設置器啓動它時發現相同的問題。從那裏,你不能使用分派器,所以我使用這個解決方案:http://stackoverflow.com/a/5971732/383129 – JoanComasFdz 2012-04-13 15:29:57

0

地址:

w.Owner = this  

例子:

private void TreeViewItem_Selected(object sender, RoutedEventArgs e) 
{ 
    Window w = new Window(); 
    w.Owner = this; 
    w.Show(); 
    e.Handled = true; 
}