"MouseLeftButtonDown" TreeViewItem 中没有引发事件,为什么?

"MouseLeftButtonDown" Event not raised in TreeViewItem, why?

我在 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的项目是有界的,通过设置ItemsSource 属性的TreeView

问题
MouseLeftButtonDown 的处理程序根本没有执行。
我在这个方法的处理程序的开头设置了一个断点,断点根本没有命中。

但是,请注意。 PreviewMouseLeftButtonDown 正在触发,我可以处理它(这个事件对我来说并不重要)

任何人都可以向我解释为什么 MouseLeftButtonDown 没有被解雇吗?
有什么让它火起来的建议吗?

更新:这个问题与MouseLeftButtonDown is not fired on TreeViewItem

不重复

我看到了那个问题和它的答案,但它不适合我。这是差异

  1. 这个问题是针对 SliverLigth 的,我的是针对 WPF 的。
  2. 那个问题是处理 TreeView.MouseLeftButtonDown,我的问题是处理 TreeViewItem.MouseLeftButtonDown
  3. 我阅读了那个问题的答案,但对我没有任何帮助

其实你在那个问题上也有同样的问题。在 TreeViewItem.OnMouseLeftButtonDown 中,事件被标记为已处理,因此它不再冒泡。

您可以通过调用下面的代码一次并为 TreeViewItem 注册自己到 MouseDownEvent 来解决这个问题。但是请注意,此代码会重定向应用程序中所有 TreeViewItem 的事件。这可能适合也可能不适合您。此外,所有鼠标按钮都会触发此事件,但您可以轻松检查单击的按钮是否为 Left

EventManager.RegisterClassHandler(typeof(TreeViewItem), Mouse.MouseDownEvent, new MouseButtonEventHandler(OnMouseButtonDown), true);

谢谢@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

如果有人遇到同样的问题,这对我有用