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>

上面的问题是它同时在帮助标题和技术指南子项上触发。

我无法将事件添加到 &lt;StackPanel&gt;,因为它不支持它,所以我用 &lt;ContentControl&gt; 包装它并尝试将事件添加到其中,但它似乎根本没有触发。

有没有什么方法可以让“技术指南”触发事件,但也可以根据第一个代码 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】:

我无法将事件添加到 &lt;StackPanel&gt;,因为它不支持它...

是的,如果您将 Background 属性设置为 Transparent 并处理 MouseLeftButtonDown 事件并检查 MouseButtonEventArgsClickCount 属性:

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 的祖先

WPF TreeViewItem 上下文菜单取消突出显示项

在wpf中将treeviewitem显示为网格行

禁用WPF TreeView(或TreeViewItem)选择?

wpf treeview中动态创建的treeViewItem如何用右键触发菜单?