C# WPF TreeViewItem MouseDoubleClick 事件在 TreeViewItem 与 TreeViewItem.Header
Posted
技术标签:
【中文标题】C# WPF TreeViewItem MouseDoubleClick 事件在 TreeViewItem 与 TreeViewItem.Header【英文标题】:C# WPF TreeViewItem MouseDoubleClick event on TreeViewItem with TreeViewItem.Header 【发布时间】:2021-12-22 05:59:56 【问题描述】:我有一个TreeView
,其中包含不同级别的TreeViewItem
。
下面完美运行:
<TreeViewItem Tag="Link" MouseDoubleClick="TreeViewItem_MouseDoubleClick">
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="Link" Margin="0 0 5 0"/>
<TextBlock Text="Link"/>
</StackPanel>
</TreeViewItem.Header>
</TreeViewItem>
但是,当他们有 TreeViewItem.Header
时,我无法正确设置 MouseDoubleClick
事件,请参见下文:
<TreeViewItem IsExpanded="True" MouseDoubleClick="TreeViewItem_MouseDoubleClick">
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="HelpCircleOutline" Margin="0 0 5 0"/>
<TextBlock Text="Help" FontWeight="Bold"/>
</StackPanel>
</TreeViewItem.Header>
<ContentControl>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="BookOpenOutline" Margin="0 0 5 0"/>
<TextBlock Text="Technical Guide"/>
</StackPanel>
</ContentControl>
</TreeViewItem>
上面的问题是它同时在帮助标题和技术指南子项上触发。
我无法将事件添加到 <StackPanel>
,因为它不支持它,所以我用 <ContentControl>
包装它并尝试将事件添加到其中,但它似乎根本没有触发。
有没有什么方法可以让“技术指南”触发事件,但也可以根据第一个代码 sn-p 添加Tag=""
属性,因为我正在检查TreeViewItem_MouseDoubleClick
事件中的值?
编辑
根据要求为MouseDoubleClick
事件提供代码:
private void TreeViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
if (sender is TreeViewItem item)
var header = item.Tag as string;
switch (header)
case "Link":
//Open new window code
break;
【问题讨论】:
你能显示你的事件双击代码吗?或者更好的是你有我可以下载你的项目的地方吗? @Frenchy 查看已编辑的问题 :) 我需要查看您的完整 xaml 文件以重现您遇到的问题, @Frenchy 该页面仅包含TreeView
和 XAML 可以在今天早些时候的这个问题上找到:***.com/questions/69898323/…
【参考方案1】:
我无法将事件添加到
<StackPanel>
,因为它不支持它...
是的,如果您将 Background
属性设置为 Transparent
并处理 MouseLeftButtonDown
事件并检查 MouseButtonEventArgs
的 ClickCount
属性:
private void StackPanel_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
if (e.ClickCount == 2)
//double-click detected
XAML:
<StackPanel Orientation="Horizontal"
Background="Transparent"
MouseLeftButtonDown="StackPanel_MouseLeftButtonDown">
<TextBlock Text="Technical Guide"/>
</StackPanel>
【讨论】:
【参考方案2】:为什么不捕获来自树视图的点击,而不是捕获来自文本块的点击?
<TreeViewItem IsExpanded="True" >
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="HelpCircleOutline" Margin="0 0 5 0"/>
<TextBlock Text="Help" FontWeight="Bold" MouseDown="TextBlock_MouseDown"/>
</StackPanel>
</TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="BookOpenOutline" Margin="0 0 5 0"/>
<TextBlock Text="Technical Guide" MouseDown="TextBlock_MouseDown"/>
</StackPanel>
</TreeViewItem>
private void TextBlock_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
// simulate doubleclick
if (e.LeftButton == MouseButtonState.Pressed && e.ClickCount == 2)
System.Diagnostics.Debug.WriteLine((TextBlock)sender.Text);
【讨论】:
这行得通,虽然只有当点击完全在文本上完成时,这意味着如果点击 TreeViewItem,而不是文本,什么也不会发生。这没什么大不了的,但我认为可以通过单击 TreeViewItem 以某种方式实现它。 无论如何,这不是构建树视图的最佳方法,请参阅wpf-tutorial.com/treeview-control/… 这是使用绑定构建树视图的方法。以上是关于C# WPF TreeViewItem MouseDoubleClick 事件在 TreeViewItem 与 TreeViewItem.Header的主要内容,如果未能解决你的问题,请参考以下文章
如何在 wpf 中的 treeviewitem 中访问 treeviewitem?
WPF 如果选中它,则只保留一个 TreeViewItem 展开,折叠其他的,除非它是 Selected TreeViewItem 的祖先