"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
不重复
我看到了那个问题和它的答案,但它不适合我。这是差异
- 这个问题是针对 SliverLigth 的,我的是针对 WPF 的。
- 那个问题是处理
TreeView.MouseLeftButtonDown
,我的问题是处理 TreeViewItem.MouseLeftButtonDown
。
- 我阅读了那个问题的答案,但对我没有任何帮助
其实你在那个问题上也有同样的问题。在 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
。
如果有人遇到同样的问题,这对我有用
我在 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
不重复我看到了那个问题和它的答案,但它不适合我。这是差异
- 这个问题是针对 SliverLigth 的,我的是针对 WPF 的。
- 那个问题是处理
TreeView.MouseLeftButtonDown
,我的问题是处理TreeViewItem.MouseLeftButtonDown
。 - 我阅读了那个问题的答案,但对我没有任何帮助
其实你在那个问题上也有同样的问题。在 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
。
如果有人遇到同样的问题,这对我有用