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

时间:2015-05-20 17:14:01

标签: 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>

这是事件的处理程序,它存在于Code Behind文件中

private void TreeViewItem_MouseLeftButtonDown(object sender,   MouseButtonEventArgs e)
{
    // some code.
}

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

通过设置TreeView的{​​{1}}属性,ItemsSource的项目受限制。

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

但是,只是为了通知。 MouseLeftButtonDown正在触发,我可以处理它(这个事件对我来说并不重要)

任何人都可以向我解释为什么PreviewMouseLeftButtonDown没有被解雇?
有什么建议可以解雇吗?

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

不重复

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

  1. 这个问题适用于SliverLigth和我的WPF。
  2. 该问题是处理MouseLeftButtonDown和我处理TreeView.MouseLeftButtonDown
  3. 我读到了这个问题的答案,并没有对我有任何帮助
  4. 先谢谢。

2 个答案:

答案 0 :(得分:2)

谢谢你@qqww2,你的答案可能有用,虽然我没有尝试,因为我找到了一个更漂亮的解决方案。
我读了Seq(11,12,13,14,15)源代码,并且我认为如果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; } 设置为true,因为我注意到此事件发生两次, 一个用于e.Handled,另一个用于其父TreeViewItem。 (因为这个事件是冒泡事件) 所以最后总是选择父TreeViewItem

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

答案 1 :(得分:1)

实际上你在这个问题上遇到了同样的问题。在TreeViewItem.OnMouseLeftButtonDown中,事件被标记为已处理,因此它不再冒泡。

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

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