c# - "MouseLeftButtonDown"TreeViewItem 中未引发事件,为什么?

标签 c# wpf treeview

我在 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.
}

我还为 TreeView 控件中的项目处理两个 HierarchicalDataTemplate

通过设置 TreeViewItemsSource 属性,对 TreeView 的项目进行限制。

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

但是,仅供引用。 PreviewMouseLeftButtonDown 正在触发,我可以处理它(此事件对我来说并不重要)

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

更新:此问题与 MouseLeftButtonDown is not fired on TreeViewItem 不重复

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

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

最佳答案

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

这对我有用,以防有人遇到同样的问题

关于c# - "MouseLeftButtonDown"TreeViewItem 中未引发事件,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30356236/

相关文章:

wpf - 从MemoryStream创建WPF BitmapImage png,gif

c# - 更改 Treeview WPF 中特定元素的颜色

c# - 如何使wpf文本 block 自动调整大小

c# - 如何在编译时自动替换字符串(C# DLL)

c# - 我的 WPF 如何启动两个窗口?

wpf - 在 WPF 网格/列表中跨越多列的最佳方法?

wpf - TreeView 因覆盖控件模板而失去虚拟化

javascript - 如果没有要显示的 child ,Kendo UI treeview 会删除 kendo ui treeview 中的展开箭头 - 无法正常工作

c# - 扩展方法作为静态类方法

c# - 如何在@Html.BeginForm中添加没有值的html属性