为什么e.Source依赖于TreeView的填充方法? [英] Why e.Source depends on TreeView populating method?
问题描述
我有两棵树:
- fooTree - 由元素组成,
- barTree - 由
这两个树都有MouseRightButtonDown事件,但e.Source类型不同:
Both trees have MouseRightButtonDown event, but the e.Source type differs:
- fooTree - System.Windows.Controls.TreeViewItem
- barTree - System.Windows.Controls.TreeView
为什么e.Source有所不同?另外,如何获取barTree的点击的项目?
Why e.Source differs? Also, how can I get the clicked item for the 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)
{
}
}
推荐答案
不知道为什么会发生这种情况,但至少我找到了一个解决方案:
Don't know why this happens, but at least I have found a solution:
http://social.msdn.microsoft.com/Forums/en-US/ wpf / thread / f0d3af69-6ecc-4ddb-9526-588b72d5196b /
-
如果您的处理程序在TreeView上,请使用
事件参数中的OriginalSource属性,并向上走视觉
父链,直到找到
TreeViewItem。然后选择它。您可以
通过使用
System.Windows.Media.VisualTreeHelper.GetParent来执行视觉父链。
If your handler is on the TreeView, use the OriginalSource property in the event arguments and walk up the visual parent chain until you find a TreeViewItem. Then, select it. You can walk the visual parent chain by using System.Windows.Media.VisualTreeHelper.GetParent.
您可以尝试注册一个类型为TreeViewItem的类处理程序和
鼠标下拉事件。然后,您的处理程序
只应在鼠标
事件通过TreeViewItem
元素时调用。
You could try registering a class handler for type TreeViewItem and the mouse down event. Then, your handler should only be called when mouse events pass through TreeViewItem elements.
您可以注册一个类型TreeViewItem的类处理程序和上下文
菜单打开事件。
You could register a class handler for type TreeViewItem and the context menu opening event.
所以我的代码是:
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;
}
这篇关于为什么e.Source依赖于TreeView的填充方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!