【问题标题】:Disabling child control events禁用子控件事件
【发布时间】:2013-11-30 09:08:21
【问题描述】:

我的自定义控件的子控件阻碍了我的自定义控件中的鼠标事件。我已经完成了接受的答案和这个线程底部的答案......

exposing-events-of-underlying-control

我还没有让他们工作(底部的答案对我来说似乎最直接)。但实际上我想完全禁用它们的事件。我有一个图片框和一个标签,我不需要与任何一个子控件进行交互。有没有办法禁用它们,这样它们就不会干扰我的自定义控件的事件?

编辑:

我正在使用自定义控件来收集和处理许多内容并将它们作为属性提供。当我单击它时,我需要访问属性。当事件发生在子控件上时,我无权访问我的自定义控件的属性。以下代码在我的表单中...

    public void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        var myControl = sender as SubstanceViewer;
        richTextBox1.Text = myControl.substanceInfo;            
    }

所以我需要访问父控件的属性。

【问题讨论】:

  • 所以你根本不想要用户控件中的事件?
  • 您可能会发现这个问题的公认答案很有用:stackoverflow.com/questions/5102982/…
  • 不,我只想禁用子控件上的事件,它们会干扰我自定义控件上的事件。
  • 那么就不要使用 PictureBox 和 Label。它们非常浪费,在 OnPaint() 方法中只需要两行代码就可以得到相同的结果。 e.Graphics.DrawImage() 和 TextRenderer.DrawText()。问题解决了。
  • 你能给我一个覆盖 OnPaint() 方法的例子吗?

标签: c# events user-controls


【解决方案1】:

如果您需要由自定义控件本身处理通常由子控件捕获的事件,则只需在自定义控件的构造函数中在运行时连接这些事件。

例如,如果您需要 PictureBox 和 Label 的 MouseMove() 事件来触发 UserControl 的已连接事件:

public partial class SomeUserControl : UserControl
{

    public SomeUserControl()
    {
        InitializeComponent();
        this.pictureBox1.MouseMove += SomeUserControl_MouseMove;
        this.label1.MouseMove += SomeUserControl_MouseMove;
    }

    private void SomeUserControl_MouseMove(object sender, MouseEventArgs e)
    {

    }

}

但请注意,由于不同的控件触发相同的处理程序,因此您需要考虑到这一点。例如,上述处理程序中的 e.Xe.Y 值将与源代码管理相关。

*您也可以在设计时使用 IDE 本身连接这些事件,但我认为代码更好地说明了解决方案。

【讨论】:

  • 谢谢,它可以捕获和处理子控件的事件。问题是我在响应自定义控件上的事件时使用了自定义控件的属性。我可以以某种方式将子控件的发送者对象转换为父控件并访问父控件的属性吗?
  • 我不是很了解,你能举个简单的例子吗?我相信它可以以某种方式完成......
猜你喜欢
  • 2011-03-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多