2009-02-27 71 views
3

我有兩棵樹:爲什麼e.Source依賴於TreeView填充方法?

  1. fooTree - 由元素,
  2. barTree - 通過

兩個樹構造具有的MouseRightButtonDown事件,但e.Source類型而不同:

  1. fooTree - System.Windows.Controls.TreeViewItem
  2. barTree - System.Windows.Controls .TreeView

爲什麼e.Source不同?另外,如何獲取barTree的點擊項目?

標記:

<TreeView Name="fooTree" MouseRightButtonDown="fooTree_MouseDown"> 
     <TreeViewItem Header="foo"></TreeViewItem> 
     <TreeViewItem Header="foo"></TreeViewItem> 
    </TreeView> 

    <TreeView Name="barTree" MouseRightButtonDown="barTree_MouseDown" ItemsSource="{Binding BarItems}"> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate> 
       <TextBlock Text="{Binding}" /> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

代碼:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
    } 

    public string[] BarItems 
    { 
     get { return new string[] { "bar", "bar" }; } 
    } 

    private void barTree_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
    } 

    private void fooTree_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
    } 
} 

回答

8

不知道爲什麼會這樣,但至少我已經找到了解決辦法:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/f0d3af69-6ecc-4ddb-9526-588b72d5196b/

  1. 如果您的處理程序是在TreeView上,使用 事件參數中的OriginalSource屬性,並沿着可視的 父鏈直到找到一個 TreeViewItem。然後,選擇它。您可以通過使用 System.Windows.Media.VisualTreeHelper.GetParent走012g可視母鏈。

  2. 您可以嘗試註冊TreeViewItem類型和 鼠標向下事件的類處理程序。然後,只有當鼠標事件通過TreeViewItem 元素時,才應調用處理程序 。

  3. 您可以爲TreeViewItem類型和上下文 菜單打開事件註冊類處理程序。

所以我的代碼是:

private void OnMouseRightButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    TreeViewItem treeViewItem = VisualUpwardSearch<TreeViewItem>(e.OriginalSource as DependencyObject) as TreeViewItem; 
} 

static DependencyObject VisualUpwardSearch<T>(DependencyObject source) 
{ 
    while (source != null && source.GetType() != typeof(T)) 
     source = VisualTreeHelper.GetParent(source); 

    return source; 
} 
+0

+1一個很好的解決方案。 – 2011-03-10 01:08:30

1

可以使用獲得的bartree點擊的項目:

((e.Source) as TreeView).SelectedValue 

但要知道,該項目實際上必須首先選擇(使用leftMouse)。該項目不立即使用RIGHTMOUSE選擇...