当前位置: 首页 > 知识库问答 >
问题:

如何防止TreeViewItem选择?

姜志行
2023-03-14

我有一个具有2级层次结构的TreeView控件。如果选择了第二级的项目,并且用户单击了另一个项目,我需要询问他是否确定要移动到另一个项目。如果他的答案是“否”,我需要阻止选择另一个TreeViewItem。

我试着这样做:

<TreeView.Resources>
    <Style TargetType="{x:Type TreeViewItem}">
        <EventSetter Event="PreviewKeyDown" Handler="TreeViewItem_OnKeyDown" />
    </Style>
</TreeView.Resources>


private void TreeViewItem_OnMouseDown(object sender, MouseButtonEventArgs e)
{
    var selectedTreeViewItem = sender as TreeViewItem;
    if (selectedTreeViewItem != null)
    {
        var myData = selectedTreeViewItem.Header as MyData;
        if (myData != null && selectedNode != null)
        {
            if (!selectedNode.DoYouAgreeToMoveToAnotherItem())
            {
                e.Handled = true;
            }
            else
            {
                myTreeView.Focus();
                myData.IsNodeSelected = true;
            }
        }
    }
}

以一种有效的方式。但是,问题是我得到了两次OnMouseDown事件:第一级项目和第二级项目。例如,对于这棵树:俄罗斯-莫斯科-皮特美国-纽约-波士顿如果我单击波士顿,我将获得美国的第一个事件,然后是波士顿的事件。所以,我无法区分案件:

  1. 当用户单击美国时

TreeViewItem_OnMouseDown我需要知道用户点击的TreeViewItem。

你能告诉我,我如何确定用户在TreeViewItem_OnMouseDown中点击的树视图?再次,如果我只是检查一个发送者。可能是美国,但实际上用户点击了波士顿。所以我需要意识到那是波士顿。

共有1个答案

常茂
2023-03-14

这只是一个粗略的示例,但您可以从代码隐藏中处理类似的内容。

XAML

<TreeView ...>
    <TreeView.Resources>
        <Style TargetType="{x:Type TreeViewItem}">
            <EventSetter Event="PreviewMouseLeftButtonDown" Handler="treeViewItem_PreviewMouseLeftButtonDown" />
        </Style>
    </TreeView.Resources>
    ...
</TreeView>

一些帮助方法

public static T GetFirstAncestorOfType<T>(DependencyObject source) where T : class
{
    while (source != null && !(source is T))
        source = VisualTreeHelper.GetParent(source);
    return source as T;
}

public static MessageBoxResult DoYouAgreeToMoveToAnotherItem()
{
    return MessageBox.Show("Select a different item?", "Select?", MessageBoxButton.YesNo);
}

代码隐藏

private TreeViewItem _selectedItem = null;

void treeViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    TreeViewItem tvi = GetFirstAncestorOfType<TreeViewItem>(e.OriginalSource as DependencyObject);

    if (_selectedItem != null &&
        tvi != null &&
        tvi != _selectedItem &&
        MessageBoxResult.Yes != DoYouAgreeToMoveToAnotherItem())
    {
        e.Handled = true;
    }
    else
    {
        // Update _selectedItem for comparison the next time this method fires.
        _selectedItem = tvi;
        if(_selectedItem != null)
            _selectedItem.IsSelected = true;
    }
}

您也可以使用纯MVVM来实现这一点。我没有时间发布使用TreeView的示例,但是解决方案可能涉及使用Dispatcher类似于这里提供的解决方案...

WPF:取消数据库列表框中的用户选择?

 类似资料:
  • 我正在使用()。有一些树节点,必须禁用这些节点才能进行选择。我试过选择活动,但它不起作用。更多信息请找到下面的代码。 如何阻止某些进行任何鼠标和键盘选择?

  • 我想使树状视图与可编辑的节点。我在谷歌上搜索了这篇好文章: http://www.codeproject.com/Articles/31592/Editable-TextBlock-in-WPF-for-In-place-Editing 但是我有一个问题。我的TreeView形成了dinamally,而不是静态的角质层。就像那样 DocPackageExtendedList的列表。 所以,第一个问

  • 我创建了一个名为的简单库,其中有两个类。第一个是称为的Hilt模块 第二个是一个简单的类。 现在我想在我的一个应用程序中使用。所以我在应用程序中添加了依赖项。 所以我的问题是 为什么库模块的依赖项进入应用程序模块,而不使用的? 如何告诉Hilt“不要在外部库(gradle依赖项)中查找@provides?”除非我用标记模块

  • 问题内容: 我发现经典的Java Deadlock Tutorial 中包含对System.out.format的调用将防止死锁的发生,我不知道为什么。 下面的代码是相同的教程,与除的 这是输出: 删除违规行会导致通常的死锁: 对System.out.format的调用是否以某种方式改变了线程获取对象内在锁的方式? 更新: 通过更改代码中启动线程的位置,我能够使系统再次陷入僵局: 这就引出了一个问

  • 问题内容: 我的侧边栏中有一个使用嵌套列表( 和 标记)的分层导航菜单。我使用的预制主题已经具有列表项的样式,但是我想更改顶级项的样式,但不能将其应用于子项。是否有一种简单的方法可以将样式应用于顶级列表项标签,​​而无需将样式层叠到其子级列表项?我知道我可以在子项目中显式添加重写样式,但是如果有一种简单的方法,只是说“将这些样式应用于此类并且不要级联,我真的很想避免必须重复所有样式代码”他们将其归

  • 本文向大家介绍如何防止XSS攻击?相关面试题,主要包含被问及如何防止XSS攻击?时的应答技巧和注意事项,需要的朋友参考一下 (1) 将前端输出数据都进行转义 (2) 将输出的字符串中的\反斜杠进行转义 (3) 从url中获取的信息,防止方法是由后端获取,在前端转义后再行输出 (4) 使用cookie的HttpOnly属性,保护好cookie 详细参见:http://blog.csdn.net/fe