【问题标题】:How to disable the capture of a Click event如何禁用对 Click 事件的捕获
【发布时间】:2012-12-29 04:53:19
【问题描述】:

在 .NET v4 上使用 VS2010 我有以下问题。

我创建了两个自定义控件,Cell 和 Board,我想使用 Cell 控件来捕获一些事件并显示一些数据。我需要捕获的最重要的事件是 Click 事件。

当自定义控件没有子控件项时,这不是问题。 在使用 Cell 的级别上,我可以毫无问题地将事件处理程序绑定到 Click 事件。

    public partial class Cell : UserControl
    {
        ....
    }

    public partial class Board : UserControl
    {
        private void InitializeComponent()
        {
            ...
            this.Cell99.Click += new System.EventHandler(this.Cell_Click);
            ...
        }
    }

Cell 控件相当小(大小约为 50x50 像素),我希望它显示的内容之一是尽可能大的整数值(大小约为 50 x 50 像素 ;-) 这样做没问题,我想为此使用一个标签控件。

一旦我向 Cell 添加另一个(例如标签)控件,它就不再可以看到某些事件,因为子事件正在获得“优先权”。对于 Label 控件覆盖的像素,它将捕获我想用 Cell 控件而不是 Label 控件处理的 Click 事件。

如果我只想在 Cell 中使用一个控件,解决方案是将事件从 Label 控件链接到 Cell 控件。但是我至少有 10 个不同的(标签)控件需要进入 Cell 以显示我拥有的所有信息。将所有控件的所有事件转发给它的父级对我来说有点麻烦。 (除了容易出错和其他错误。)

为用户控件中的子控件禁用事件捕获的正确方法是什么?

如前所述,我曾想过将事件从孩子转发给父母,但现在拒绝了。

然后我想到了不使用控件来显示数据,而是生成一个包含信息的位图并将其用作背景。我……不期待那个

最后,我想到了在所有其他控件之上放置一个额外控件,并将其捕获的事件转发给父级。这可能是最简单的继续方式。

不知何故,我认为必须有更好的方法来解决这个问题,但是如何?

欢迎任何建议。

【问题讨论】:

  • 您能向我们展示您的一些 XAML 吗?我刚刚创建了一个 WPF Windows,添加了一个带有边框的 WPF UserControl 和一个占据整个空间的标签,然后我什至在窗口后面的代码中的标签和 UserControl 上注册了 MouseUp,如果我点击标签,两个处理程序都会被触发。
  • 致蒂莫西:哎呀,标签错误,我在这个项目中使用的是窗口窗体,而不是 WPF。对不起。
  • 致 dabisoa:给定的解决方案是 TextBlock 上的“IsHitTestVisible="false"。”标签控件没有该属性。我错过了什么?
  • IsHitTestVisible 适用于 WPF 而不是 WinForms

标签: c# winforms


【解决方案1】:

实现一个从 Windows.Forms.Label 继承的标签类。在这个派生的标签/组件类中,添加一个方法或机制,将标签接收到的任何点击事件转发到父 Cell 控件。作为 Cell 的子控件添加的任何标签都将属于此自定义标签类,并且都将其 Click 事件转发给父级,而无需为每个标签实例手动执行此操作。

【讨论】:

  • 好主意,我喜欢它,会试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多