TreeViewItem 中未引发“MouseLeftButtonDown”事件,为啥?
Posted
技术标签:
【中文标题】TreeViewItem 中未引发“MouseLeftButtonDown”事件,为啥?【英文标题】:"MouseLeftButtonDown" Event not raised in TreeViewItem, why?TreeViewItem 中未引发“MouseLeftButtonDown”事件,为什么? 【发布时间】:2015-08-02 02:06:51 【问题描述】:我在 WPF 应用程序中有一个 TreeView
。如下。
<TreeView x:Name="documentOutlinePanel">
<TreeView.ItemContainerStyle>
<Style TargetType="x:Type TreeViewItem">
<EventSetter Event="TreeViewItem.MouseLeftButtonDown" Handler="TreeViewItem_MouseLeftButtonDown"/>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
这里是事件的处理程序,它存在于代码隐藏文件中
private void TreeViewItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
// some code.
我还处理两个HierarchicalDataTemplate
用于可以在TreeView
控件中的项目。
TreeView
的项目是有界的,通过设置TreeView
的ItemsSource
属性。
问题 MouseLeftButtonDown
的处理程序根本不执行。
我在这个方法的处理程序的开头设置了一个断点,并且断点根本没有命中。
但是,只是为了通知。
PreviewMouseLeftButtonDown
正在触发,我可以处理它(这个事件对我来说并不重要)
谁能向我解释为什么MouseLeftButtonDown
没有被解雇?
有什么建议让它着火吗?
更新:这个问题与MouseLeftButtonDown is not fired on TreeViewItem没有重复
我看到了那个问题及其答案,但它不适合我。这是区别
-
这个问题是针对 SliverLigth 的,我的问题是针对 WPF 的。
那个问题是处理
TreeView.MouseLeftButtonDown
和我的处理TreeViewItem.MouseLeftButtonDown
。
我阅读了该问题的答案,但对我没有任何帮助
【问题讨论】:
MouseLeftButtonDown is not fired on TreeViewItem的可能重复 不是它不是重复的。我看到了这个问题及其答案,但它不适合我。这是区别1-该问题针对SliverLigth,而我针对WPF。 2-那个问题是处理 TreeView.MouseLeftButtonDown 和我的处理 TreeViewItem.MouseLeftButtonDown。 3- 我阅读了该问题的答案,但对我没有任何帮助,谢谢。 【参考方案1】:谢谢@qqww2,你的回答可能有用,虽然我没有尝试,因为我找到了一个更漂亮的解决方案。
我阅读了TreeViewItem.OnMouseLeftButtonDown
源代码,我发现如果TreeViewItem
成功获得焦点,则此事件在此方法中被标记为已处理。 所以我将TreeViewItem
对象设置为UnFocusable
。
<TreeView x:Name="documentOutlinePanel">
<TreeView.ItemContainerStyle>
<Style TargetType="x:Type TreeViewItem">
<Setter Property="Focusable" Value="False"/>
<EventSetter Event="TreeViewItem.MouseLeftButtonDown" Handler="TreeViewItem_MouseLeftButtonDown"/>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
这会触发MouseLeftButtonDown
事件。
在此事件的处理程序中,我将Focus
设置为这样
private void TreeViewItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
TreeViewItem item = (TreeViewItem)sender;
// do what i want.
item.Focusable = true;
item.Focus();
item.Focusable = false;
e.Handled = true;
e.Handled
设置为 true,因为我注意到这个事件发生了两次,
一个用于TreeViewItem
,一个用于其父TreeViewItem
。 (因为这个事件是冒泡事件)
所以最后总是选择父TreeViewItem
。
如果有人遇到同样的问题,这对我有用
【讨论】:
【参考方案2】:实际上,您在该问题中遇到了同样的问题。在TreeViewItem.OnMouseLeftButtonDown
中,该事件被标记为已处理,因此它不再冒泡。
您可以通过调用下面的代码一次并将自己注册到MouseDownEvent
为TreeViewItem
来克服这个问题。但是请注意,此代码会重定向应用程序中所有 TreeViewItem
的事件。这可能适合您,也可能不适合您。此外,所有鼠标按钮都会触发此事件,但您可以轻松检查单击的按钮是否为Left
。
EventManager.RegisterClassHandler(typeof(TreeViewItem), Mouse.MouseDownEvent, new MouseButtonEventHandler(OnMouseButtonDown), true);
【讨论】:
其实你还是可以挂到MouseLeftButtonDown
,这样你就不用检查哪个鼠标按钮被点击了:EventManager.RegisterClassHandler(typeof(TreeViewItem), TreeViewItem.MouseLeftButtonDownEvent, ...
以上是关于TreeViewItem 中未引发“MouseLeftButtonDown”事件,为啥?的主要内容,如果未能解决你的问题,请参考以下文章
WPF 解决多个TreeViewItem同时触发某事件的简单方法
WPF 解决多个TreeViewItem同时触发某事件的简单方法
WPF 解决多个TreeViewItem同时触发某事件的简单方法
在 python inotify 中未引发 IN_Q_OVERFLOW 事件