【问题标题】:How can I make the inner controls don't cover the main control's events?如何使内部控件不覆盖主控件的事件?
【发布时间】:2013-02-11 04:23:28
【问题描述】:

我有一个UserControl,其中包含一些内部控件。像这样:

现在,当我在我的项目中使用它时,我希望我的控件的每个点在被点击时都会引发相同的点击事件,就像其他控件一样。

但问题是:我的处理程序在另一个项目中,仅在我单击背景上的某个位置时处理单击事件,而不是在 button1 或 label1 上。

我可以通过设置内部控件中的每个事件为主控件引发另一个事件来解决它,但这有点奇怪。

如何让内部控件不覆盖主控件的事件?

【问题讨论】:

  • 有点奇怪,那你怎么触发按钮点击呢?那你为什么需要一个按钮?
  • @NikolaDavidovic 好吧,您可以为整个 UC 中的任何单击设置一个处理程序,并在仅单击按钮时运行另一个处理程序。每个事件可以有多个处理程序,因此没有什么可以阻止它。
  • @Servy True 但我期待 OP 的回答,这样他会澄清问题,我们可以提供更好的答案。
  • @Nikola 嗨,这只是一个例子。我们可以说一个图片框和一个标签或其他东西..例如一个旁边有一个图标的控件。
  • @Blazi 那么在这种情况下,我想不出比将相同的 Click 处理程序分配给所有控件的 Click 事件更好的方法了。

标签: c# vb.net winforms user-controls


【解决方案1】:

我建议利用UserControls Load 事件来迭代项目中的所有子控件,并以编程方式为每个 MouseMoved 事件添加一个处理程序。这将足够强大以处理添加的任何新子控件。例如;

    private void UserControl1_Load(object sender, EventArgs e)
    {
        foreach (Control c in Controls)
        {
            c.MouseMove += Control_Move;
        }
    }

    protected void Control_Move(object sender, MouseEventArgs e)
    {
        // do stuff here
    }

并且不要忘记将您的 UserControl 的 MouseMove 事件与相同的 Control_Move 方法挂钩

【讨论】:

  • 只有当每个子控件都做同样的事情时才是正确的,他们可能不会这样做。
  • @Servy true... 我能想到的唯一其他方法是深入研究 Win32 api 并添加消息挂钩。如果 .NET 没有公开必要的事件,那么除了有效地创建自己的事件之外,您无能为力
  • @DiskJunky 谢谢,所以我应该添加每个事件,MouseMoveMouseClickLoad,...这样一个一个一个?
  • @Blazi 无论如何都要处理每个事件。你到底想做什么?
【解决方案2】:

我在 Delphi 中做过类似的事情。诀窍是不添加标签,而是添加标签、按钮等的子类,以调用事件的父事件。

子类只是覆盖 Click、Move 等并调用父类。简单,如果您有很多这些,可以节省大量时间。

【讨论】:

  • 您能否解释一下如何覆盖事件?
  • 类 ParentUserControl : UserControl { public override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); } } //你的新控件派生自这个............ class ParentClickButton : Button { protected override void OnMouseDown(MouseEventArgs meevent) { ((ParentUserControl)this.Parent).OnMouseDown(mevent); base.OnMouseDown(mevent); } } //你的新控件添加了这些而不是按钮...
  • 另外,看看这篇文章,了解我以前使用过的另一种方法:stackoverflow.com/questions/547172/…
猜你喜欢
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
相关资源
最近更新 更多