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

ale*_*2k8 3 wpf treeview event-handling

我有两棵树:

  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>
Run Code Online (Sandbox Code Playgroud)

码:

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) 
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

ale*_*2k8 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遍历可视父链.

  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;
}
Run Code Online (Sandbox Code Playgroud)