我在 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
。
通过设置 TreeView
的 ItemsSource
属性,对 TreeView
的项目进行限制。
问题
MouseLeftButtonDown
的处理程序根本不执行。
我在这个方法的处理程序的开头设置了一个断点,但断点根本没有命中。
但是,仅供引用。
PreviewMouseLeftButtonDown
正在触发,我可以处理它(此事件对我来说并不重要)
任何人都可以向我解释为什么 MouseLeftButtonDown
没有被触发吗?
有什么建议让它火吗?
更新:此问题与 MouseLeftButtonDown is not fired on TreeViewItem 不重复
我看到了这个问题及其答案,但它不适合我。这是差异
- 这个问题是针对 SliverLigth 提出的,我的问题是针对 WPF 提出的。
- 这个问题是处理
TreeView.MouseLeftButtonDown
,我的问题是处理TreeViewItem.MouseLeftButtonDown
。 - 我阅读了该问题的答案,但它对我没有任何帮助
最佳答案
谢谢@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/