TreeViewItem.Header TreeViewItem 上的 C# WPF TreeViewItem MouseDoubleClick 事件

C# WPF TreeViewItem MouseDoubleClick event on TreeViewItem with TreeViewItem.Header

我有一个 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>

上面的问题是它在帮助 header 和技术指南 child 上触发。

我无法将事件添加到 <StackPanel> 上,因为它不支持它,所以我用 <ContentControl> 包装它并尝试将事件添加到其中,但它似乎没有完全触发。

有什么方法可以只让“技术指南”触发事件,同时根据第一个代码片段添加 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;
             }
     }

为什么不捕获来自树视图的点击,而不是捕获来自文本块的点击?

        <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);
        }
    }

I cannot add the event onto the <StackPanel> as it doesn't support it ...

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

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>