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 的项目是有界的,通过设置TreeViewItemsSource 属性。

问题 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 中,该事件被标记为已处理,因此它不再冒泡。

您可以通过调用下面的代码一次并将自己注册到MouseDownEventTreeViewItem 来克服这个问题。但是请注意,此代码会重定向应用程序中所有 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 事件

设置 NSManagedObject 的 Bool 属性会引发“iOS 10 中未捕获的异常”

迁移中未找到模型(apps.get_model 引发 LookupError)