我有两棵树:
两棵树都有MouseRightButtonDown事件,但e.Source类型不同:
为什么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)
{
}
}
答案 0 :(得分:8)
不知道为什么会这样,但至少我找到了解决方案:
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/f0d3af69-6ecc-4ddb-9526-588b72d5196b/
如果您的处理程序在TreeView上,请使用中的OriginalSource属性 事件参数和走视觉 父链直到找到一个 树型视图。然后,选择它。您可以 通过使用走视觉父链 System.Windows.Media.VisualTreeHelper.GetParent。
您可以尝试为类型TreeViewItem注册类处理程序 鼠标按下事件。然后,你的处理程序 只应在鼠标时调用 事件通过TreeViewItem传递 元件。
- 醇>
您可以为类型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;
}
答案 1 :(得分:1)
您可以使用以下方式获取bartree中的点击项目:
((e.Source) as TreeView).SelectedValue
但请注意,该项目必须先选择(使用leftMouse)。使用rightMouse ...
不会立即选择该项目