即使我没有右键单击该节点,树视图节点也会突出显示

2024-04-25

我正在开发一个winform,在我的UI上有一个树视图,我发现即使我没有用鼠标右键单击该节点,树节点也会突出显示(例如,当我单击以下位置时,Node1将突出显示),但我真的不喜欢这种行为,因为我想在没有单击树节点时显示不同的上下文菜单

+根节点

  |_ Node1                [ Right Click Here, Node1 will be highlighted]
  |
  |_ Node2                [ Right Click Here, Node2 will be highlighted]

离开对 Kevin Wienhold 答案的评论,您只想允许用户单击树视图的空白区域并取消选择任何选定的节点。

您可以通过处理来做到这一点MouseDown event http://msdn.microsoft.com/en-us/library/system.windows.forms.control.mousedown.aspx of the TreeView控制,并设置SelectedNode财产 http://msdn.microsoft.com/en-us/library/system.windows.forms.treeview.selectednode.aspx to null如果鼠标单击不包含节点的位置。例如,您可以使用以下代码:

private void myTreeView_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
    if (myTreeView.HitTest(e.Location).Node == null)
    {
        myTreeView.SelectedNode = null;
    }
}

这利用了HitTest method http://msdn.microsoft.com/en-us/library/z6sb88bz.aspx确定哪个节点位于特定点,将鼠标事件的位置指定为要测试的点。当用户使用时,您不需要任何其他代码来像往常一样选择节点does点击它们;这是由自动处理的TreeView.


EDIT:正如我对这个问题的评论所表明的那样,我仍然非常不清楚你想在这里完成什么。如果您确实想在节点侧面的空白处按住鼠标右键时防止节点暂时突出显示,那么事情会变得更复杂一些。

我之前研究过这个问题,棘手的部分是按住鼠标按钮时不会收到窗口消息,至少在移动鼠标之前不会收到窗口消息(在这种情况下,无论如何都不再选择该节点) 。此行为显然是由操作系统决定的,并且使用标准 .NET 提供的事件不容易覆盖。您可以尝试取消点击右键MouseDown整天都有事件发生,但在您的控件中引发此事件之前,Windows 已选择该节点(请记住,.NET 提供的控件,例如TreeView and ListView只是 Windows API 提供的相同控件的包装器,它本身显然实现了这种“按住右键时选择节点”行为)。

What does然而,工作是压倒一切的WndProc http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx在派生的TreeView控制和处理WM_RBUTTONDOWN message http://msdn.microsoft.com/en-us/library/ms646242%28VS.85%29.aspx。但请注意,即使设置SelectedNode财产给null在这里不起作用,因为直到afterWindows 会自动选择节点作为对单击鼠标右键的响应 - 无论您做什么,都必须防止基节点TreeView控制从接收WM_RBUTTONDOWN信息。因此,您有几种处理此问题的选择:

  1. 您可以通过提前退出来简单地取消右键单击消息return陈述。当然,这意味着您将无法在您的系统中处理此事件MouseDown处理程序,因为它从未真正传递给控件!因此,如果您想显示弹出式上下文菜单,这可能不适合您。

    public class NewTreeView : System.Windows.Forms.TreeView
    {
        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
            const int WM_RBUTTONDOWN = 0x204;
            if (m.Msg == WM_RBUTTONDOWN)
            {
                return;
            }
            base.WndProc(ref m);
        }   
    }
    
  2. 您可以在覆盖的内容中显示上下文菜单WndProc方法作为对WM_RBUTTONDOWN消息,然后return从方法中不允许基类处理消息。这与第一个解决方案执行完全相同的操作(防止右键单击事件导致节点显示为选中状态),但它确实允许您在右键单击时显示上下文菜单(或执行任何其他您想要的操作)发生。当然,这确实意味着所有相关代码都必须包含在您的子类中TreeView控件,不在表单的 UI 代码中处理,这对您来说可能方便也可能不方便。

    public class NewTreeView : System.Windows.Forms.TreeView
    {
        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
            const int WM_RBUTTONDOWN = 0x204;
            if (m.Msg == WM_RBUTTONDOWN)
            {
                //Create and show a context menu
                var myContextMenu = new ContextMenuStrip();
                myContextMenu.Items.Add("First Item");
                myContextMenu.Items.Add("Second Item");
                return;
            }
            base.WndProc(ref m);
        }   
    }
    
  3. 你可以提高你的own http://msdn.microsoft.com/en-us/library/wkzf914z.aspx RightMouseClick您自定义的事件TreeView类作为对WM_RBUTTONDOWN消息,然后您可以根据需要从表单的 UI 代码中处理该消息。通过不通过WM_RBUTTONDOWN给基地留言TreeView控件类,这实现了与前两个建议相同的目标,但允许您在表单的 UI 代码中处理右键单击事件,而不必将所有逻辑放入子类控件的WndProc.

    public class NewTreeView : System.Windows.Forms.TreeView
    {
        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
            const int WM_RBUTTONDOWN = 0x204;
            if (m.Msg == WM_RBUTTONDOWN)
            {
                //Raise your custom event
                OnRightMouseClick(new EventArgs());
                return;
            }
            base.WndProc(ref m);
        }   
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使我没有右键单击该节点,树视图节点也会突出显示 的相关文章

  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • 选择initializer_list迭代器定义

    Why std initializer list
  • FluentAssertions ShouldNotThrow 无法识别异步方法/Func

    我正在尝试检查异步方法是否抛出具体异常 为此 我使用 MSTEST 和 FluentAssertions 2 0 1 我已经检查过这个关于 Codeplex 的讨论 http fluentassertions codeplex com wo
  • std::make_pair 与浮点数组(float2,无符号整数)

    我有一个用 float2 unsigned int 对模板化的向量 例如 std vector
  • 检查两个函数或成员函数指针的签名是否相等

    我编写了一些代码来检查自由函数的签名是否等于成员函数的签名等 它比较提取的返回类型和函数参数 include
  • 查找方法不适用于 EF6.1 模拟

    我已经使用这些 msdn 指南设置了模拟 使用模拟框架进行测试 EF6 及以上 http msdn microsoft com en us data dn314429 var bsAc db BusAcnts FirstOrDefault
  • linq where 子句和 count 导致 null 异常

    除非 p School SchoolName 结果为 null 否则下面的代码将起作用 在这种情况下 它会导致 NullReferenceException if ExistingUsers Where p gt p StudentID i
  • 在 C# .NET 中对非 ASCII 字符进行编码

    我想向我的应用程序发送的电子邮件添加自定义标头 标头名称只能包含 ASCII 字符 但对于值和用户可能会输入 UTF 8 字符 我必须对它们进行 Base64 编码 此外 我还必须将它们解码回 UTF 8 以便在 UI 中向用户显示它们 最
  • 从具有相同属性的另一个对象创建对象

    我有一个 C 对象 可以说有 20 个属性 它是数据契约的一部分 我还有另一个具有类似属性的业务实体 我想从响应对象中填充该实体 除了将一个对象的每个属性分配给另一个对象的相应属性之外 还有其他方法可以做到这一点吗 是的 看看自动映射器 h
  • 在 C# 命令行应用程序中包含并执行 EXE

    所以我找到了一个很棒的小 EXE 命令行应用程序 我们将其称为 program exe 它输出一些我想用 C 操作的数据 我想知道是否有一种方法可以将program exe 打包 到我的Visual Studio项目文件中 这样我就可以将编
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 'iter' 的名称查找已更改为新的 ISO 'for' 范围

    我正在尝试编译下面的两个文件 但从编译器收到错误消息 gcc 4 3 3 Linux 错误位于带有以下符号的行 LINE WITH ERROR 我做错了什么 我该怎么改变 路易斯 g c b h b cpp b cpp In functio
  • 如何重用具有稍微不同的 ProcessStartInfo 实例的 Process 实例?

    我有以下开始的代码robocopy https technet microsoft com en us library cc733145 aspx as a Process 我还需要进行数据库查询以确定每次需要复制哪些目录robocopy被
  • 展开 std::reference_wrapper 的成本

    Given include
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • C# PasswordDeriveBytes:似乎 Salt 并不重要

    可能我误解了什么 以下代码通过 CryptDeriveKey 使用两种不同的盐生成两个相等的密钥 这是控制台结果 盐1 21 3e 18 a3 9a 8b 5f gt 键 da 89 ea 3d 91 08 20 98 20 e9 dc 4
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有
  • 如何通过API退出Win32应用程序?

    我有一个使用 Win32 API 编写的 C Win32 应用程序 我希望强制它在其中一个函数中退出 有没有类似的东西Exit or Destroy or Abort 类似的东西会终止它吗 哎呀呀呀呀呀呀 不要做任何这些事情 exit 和
  • 如何根据当前日期时间发现财政年度?

    我需要基于当前或今天的日期时间的财政年度 假设我们认为今天的日期是10 April 2011 那么我需要输出为Financial Year 2012在某些情况下 我需要以短格式显示相同的输出FY12 我想以两种方式显示 在我们的要求中 考虑

随机推荐

  • React useState() 不同步更新值[重复]

    这个问题在这里已经有答案了 如果在设置值后立即调用 React useState 不会更新变量的值 我读过有关 useEffect 的内容 但并不真正知道这对于这个特定场景有何用处 完整代码 https codesandbox io s n
  • 如何从 ControlTemplate 检索 VisualChild

    我在 NET 3 5 SP1 中有一个 WPF 应用程序 它正在使用TabControl 在那我们有TabItems 这反过来又有它们的Styles确定当前显示的项目 假设我们有一个TabItem named Books now Books
  • Cassandra 中的 SASI 索引似乎有一些错误

    我刚刚开始在 Cassandra 3 7 0 上使用 SASI 索引 遇到了一个问题 我怀疑这是一个错误 我几乎没有追踪到该错误出现的情况 以下是我发现的 使用 SASI 索引查询时 它可能会错误地返回 0 行 改变一点条件 它又可以工作了
  • 在 Bokeh 服务应用程序中绘制本地图像

    我正在尝试使用绘制 png 图像ImageURL本地存储在应用程序中的类 static目录 在下面的代码中 当使用同一图像的 Web url 时 它会按预期工作 但所有创建本地 url 的尝试都会失败 此外 当运行基本相同的代码并输出到文件
  • 是否可以编写 TFS 查询来获取任务实际花费的时间?

    我一直在使用 TFS 来跟踪我的待办事项 现在我正在尝试编写一个查询来查看我在过去 7 天内完成特定任务所花费的时间 到目前为止我有这个查询 工作项类型 任务 AND 状态 完成 AND 关闭日期 Today 7 AND 区域路径 Proj
  • SQL Server:将((int)年,(int)月,(int)日)转换为日期时间[重复]

    这个问题在这里已经有答案了 可能的重复 使用 T SQL 创建日期 https stackoverflow com questions 266924 create a date with t sql 我有一个数据表 将每年 月份和日期的值存
  • 这段代码的复杂度是多少? (大O)这是线性的吗?

    for int i 0 i
  • git fetch 和 checkout FETCH_HEAD 的作用是什么?

    以下命令的作用是什么 git fetch
  • Scala 中的部分排序集合

    我正在尝试对链表节点的集合进行排序 该集合包含来自多个链表的节点 必须在每个列表中维护排序 但跨列表的排序并不重要 PartialOrdering T 似乎是自然的选择 但我在 Scala 中找不到任何支持它的标准函数 例如 sort只需要
  • Object.prototype.__defineGetter__(和 __defineSetter__)polyfill

    我知道 defineGetter and defineSetter 方法名称确实是奇怪且已弃用 http whereswalden com 2010 04 16 more spidermonkey changes ancient esote
  • 每个表都应该有主键吗?

    我正在创建一个数据库表 但没有为其分配逻辑主键 每个表都应该有主键吗 简短回答 yes 长答案 你需要你的桌子可以加入一些东西 如果您希望表聚集 则需要某种主键 如果您的表设计不需要主键 请重新考虑您的设计 很可能您遗漏了某些内容 为什么要
  • Android:想要在相机预览上放置剪影叠加

    我想知道如何在相机预览上添加剪影 到目前为止 我已经完成了以下示例 它只是预览相机 http developer android com reference android view TextureView html http develo
  • 快速排序和调整快速排序有什么区别?

    快速排序和调整快速排序之间的根本区别是什么 快速排序有何改进 Java 如何决定使用它而不是合并排序 正如蜥蜴比尔所说 调整的快速排序仍然具有与基本快速排序相同的复杂性 O N log N 平均复杂度 但调整的快速排序使用一些不同的方法来尝
  • UIScrollView 缩小具有 -ve 原点的视图

    我有一个 UIScrollView 在此我有一个 UIView 它的框架具有负原点 我需要限制滚动视图 以便您无法滚动整个视图 我已经在这个滚动视图中实现了缩放 缩放时 滚动视图将根据比例调整可缩放视图的大小 但它并不能调整原点 所以如果我
  • Python .NET WinForms - 如何将信息从文本框传递到按钮单击事件

    在回答我的问题之前 我正在 自学 学习 Python 和 NET CLR 如何相互交互 这是一次有趣的经历 但有时也是一次令人沮丧的经历 话虽如此 我正在使用 NET WinForm 它应该只是传递输入到文本框中的数据并通过消息框显示它 学
  • 货运公司如何决定是否重建部门?

    我正在考虑跳过货物中的依赖关系构建步骤 我有一个简单的项目 使用 3 个板条箱作为依赖项 在Cargo toml 我使用一次构建项目cargo build release 现在我有另一个项目 它使用其中提到的相同依赖项Cargo toml文
  • 重置流的状态

    我有一个问题与 stackoverflow 上的这个问题有点相似std cin clear 无法将输入流恢复到良好状态 https stackoverflow com questions 4960399 stdcin clear fails
  • 用逗号连接字符串并在每个元素周围加上引号

    我有以下字符串 s tring abcd efgh igkl mnop qrst uvwx yz 我想创建一个列表并用逗号分隔它并在每个元素周围加上引号 如下所示 some list abcd efgh igkl mnop qrst uvw
  • Amplify 的completeNewPassword 方法针对用户数据抛出 TypeError

    我尝试将自定义 UI 与 aws Amplify 结合使用 但遇到了 Auth completeNewPassword 问题 任何使用此方法的尝试都会引发错误Error in v on handler TypeError Cannot re
  • 即使我没有右键单击该节点,树视图节点也会突出显示

    我正在开发一个winform 在我的UI上有一个树视图 我发现即使我没有用鼠标右键单击该节点 树节点也会突出显示 例如 当我单击以下位置时 Node1将突出显示 但我真的不喜欢这种行为 因为我想在没有单击树节点时显示不同的上下文菜单 根节点