【问题标题】:TreeViewItem MouseDoubleClick not proving correct sender in event handlerTreeViewItem MouseDoubleClick 未在事件处理程序中证明正确的发件人
【发布时间】:2011-02-12 13:43:43
【问题描述】:

我有一个包含一些节点和一些子节点的树视图。在这些子节点中,我为 MouseDoubleClick 附加了一个事件处理程序。

但是在事件处理程序中,sender 参数是指父节点,而不是我双击的子节点。

private void Window_Initialized(object sender, EventArgs e)
{

    string[] drives = System.Environment.GetLogicalDrives();
    foreach (string drive in drives)
    {
        TreeViewItem node = new TreeViewItem(){Header=drive,Tag=drive};
        TreeViewFolders.Items.Add(node);
        node.MouseDoubleClick+=new MouseButtonEventHandler(rootUI_MouseDoubleClick);
    }
}

void rootUI_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    TreeViewItem node = sender as TreeViewItem;
    node.Items.Clear();
    string folder = ((TreeViewFolders.SelectedItem as TreeViewItem).Tag) as string;

        try
        {
            DirectoryInfo[] subDirectories = new DirectoryInfo(folder).GetDirectories();
            foreach (DirectoryInfo sd in subDirectories)
            {
                TreeViewItem subnode = new TreeViewItem() { Header = sd.Name,Tag=sd.FullName};
                node.MouseDoubleClick += new MouseButtonEventHandler(rootUI_MouseDoubleClick);
                node.Items.Add(subnode);
            }
        }
        catch
        {
        }
        e.Handled = true;
}

在最顶层,有逻辑驱动器,然后是子文件夹等等。
当我单击子节点(逻辑驱动器中的文件夹)时,sender 参数仍然是本地驱动器,而不是特定的子节点。

当我使用 SelectedItem 而不是 sender 时,它可以正常工作。

【问题讨论】:

    标签: wpf


    【解决方案1】:

    您的代码将另一个双击处理程序添加到触发双击处理程序的同一节点。也许您打算为双击子节点添加一个处理程序?

    【讨论】:

    • 你可以看到我也在为新创建的节点附加事件处理程序。代码:foreach (DirectoryInfo sd in subDirectories) { TreeViewItem subnode = new TreeViewItem() { Header = sd.Name,Tag =sd.FullName}; node.MouseDoubleClick += new MouseButtonEventHandler(rootUI_MouseDoubleClick); node.Items.Add(子节点); }
    • Rick,这是我的错误,我更正了将事件处理程序添加到子节点的代码。通过这种方式,我得到了正确的发送者,但在它之后,事件也会触发父节点,清除子节点。你能纠正我吗。
    • @Akshay:由于Control.MouseDoubleClick 的工作方式,它会一直沿TreeViewItem 父链向上触发。为防止这种情况,您可以添加 PreviewMouseLeftButtonDown 处理程序并检查 sender == e.Source && e.ClickCount == 2 以仅检测双击项目上的双击。
    • 但是从书中所说,抑制事件冒泡的常用方法是将 e.Handled 设置为 true,我在我的代码中这样做。为什么它不起作用。
    • 碰巧,Control.MouseDoubleClick 是一个直接路由事件,因此它只会发送到引发它的对象,因此您是否处理它并不重要,因为它不会冒泡。换句话说,如果MouseDoubleClick 出现在两个或更多TreeViewItem 控件上,则不是因为冒泡。原因是MouseDoubleClick 是一个基于MouseLeftButtonDown 的合成事件,它确实冒泡并且没有人处理它。
    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多