为什么e.Source依赖于TreeView填充方法?

时间:2009-02-27 01:21:07

标签: wpf treeview event-handling

我有两棵树:

  1. fooTree - 由元素组成,
  2. barTree - 由
  3. 构建

    两棵树都有MouseRightButtonDown事件,但e.Source类型不同:

    1. fooTree - System.Windows.Controls.TreeViewItem
    2. barTree - System.Windows.Controls.TreeView
    3. 为什么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) 
          {
          }
      }
      

2 个答案:

答案 0 :(得分:8)

不知道为什么会这样,但至少我找到了解决方案:

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

  
      
  1. 如果您的处理程序在TreeView上,请使用中的OriginalSource属性   事件参数和走视觉   父链直到找到一个   树型视图。然后,选择它。您可以   通过使用走视觉父链   System.Windows.Media.VisualTreeHelper.GetParent。

  2.   
  3. 您可以尝试为类型TreeViewItem注册类处理程序   鼠标按下事件。然后,你的处理程序   只应在鼠标时调用   事件通过TreeViewItem传递   元件。

  4.   
  5. 您可以为类型TreeViewItem和上下文注册类处理程序   菜单开幕活动。

  6.   

所以我的代码是:

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

答案 1 :(得分:1)

您可以使用以下方式获取bartree中的点击项目:

((e.Source) as TreeView).SelectedValue

但请注意,该项目必须先选择(使用leftMouse)。使用rightMouse ...

不会立即选择该项目