【问题标题】:TreeViewItem event bubbles through parentsTreeViewItem 事件通过父母冒泡
【发布时间】:2020-08-31 09:57:56
【问题描述】:

我在运行时在我的TreeView 中创建了一个简单的树。

每个TreeViewItem 都有一个鼠标双击事件,该事件应该打印出所单击项目的标题以及与该项目相关的一些信息。但是,如果双击 6,该事件将在 6 上触发,并在每个项目中冒泡。即使handled设置为true。


<Window x:Class="TreeBubbleIssue.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <TreeView Name="TestingTree" />
    </Grid>
</Window>
using System;
using System.Diagnostics;
using System.Linq;
using System.Windows.Controls;

namespace TreeBubbleIssue
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
            RunTimeGeneratedTree();
        }

        private void RunTimeGeneratedTree()
        {
            TreeViewItem first = new TreeViewItem { Header = 1 };

            string randomString = RandomString();

            first.MouseDoubleClick += (sender, args) =>
            {
                Debug.WriteLine($"{first.Header}: {randomString}");
                args.Handled = true;
            };

            TreeViewItem last = first;

            for (int i = 2; i <= 6; i++)
            {
                TreeViewItem item = new TreeViewItem { Header = i };
                string otherInfoFromElseWhere = RandomString();
                item.MouseDoubleClick += (sender, args) =>
                {
                    Debug.WriteLine($"{item.Header}: {otherInfoFromElseWhere}");
                    args.Handled = true;
                };

                last.Items.Add(item);
                last = item;
            }

            TestingTree.Items.Add(first);
        }

        private static readonly Random Random = new Random();

        public static string RandomString()
        {
            const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            return new string(Enumerable.Repeat(chars, 50)
                .Select(s => s[Random.Next(s.Length)]).ToArray());
        }
    }
}

【问题讨论】:

  • 一个 teeviewitem 是一个 headereditems 控件。 1 包含 2,其中包含 3。您正在查看的所有内容都在 treeviewitem 1 中。

标签: c# wpf .net-core


【解决方案1】:

根据 MSDN 论坛上的this issue,这是预期的行为。尽管您处理了事件,但它仍然会冒泡。您可以尝试两种解决方法。

  • 检查事件处理程序中的SelectedItem
  • 检查OriginalSource 并找到TreeViewItem 的第一个父级

由于第一个可能不适用于其他点击事件,所以我将向您展示第二个的示例。

item.MouseDoubleClick += (sender, args) =>
{
   if (FindParent<TreeViewItem>((DependencyObject)args.OriginalSource) == args.Source)
      Debug.WriteLine($"{item.Header}: {otherInfoFromElseWhere}");
};
public static DependencyObject FindParent<T>(DependencyObject dependencyObject)
{
   while (dependencyObject != null && typeof(T) != dependencyObject.GetType())
      dependencyObject = VisualTreeHelper.GetParent(dependencyObject);

   return dependencyObject;
}

【讨论】:

    猜你喜欢
    • 2017-05-02
    • 2021-07-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2011-10-20
    • 2011-08-23
    相关资源
    最近更新 更多