我在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
不重复我看到了这个问题及其答案,但这并不适合我。这是差异
MouseLeftButtonDown
和我处理TreeView.MouseLeftButtonDown
。 先谢谢。
答案 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);