【问题标题】:Stop bubbling events in WinForms在 WinForms 中停止冒泡事件
【发布时间】:2012-09-30 23:20:54
【问题描述】:

我有一个(自定义)MyTextbox。 MyTextbox 位于(自定义)MyPanel,面板位于MyForm。

当用户在 MyTextbox 中编辑文本并按下时,说“DEL”,MyForm 会收到 _KeyDown 事件...

但在表单上,​​我编写了其他操作,当按下“删除”时,它会执行表单操作以及文本框选择删除...

如何阻止事件从文本框传播到表单,或者将文本框识别为事件的发送者?

附言。
由于多种原因,我无法将 KeyPreview 设置为“False”,我需要寻找其他解决方案。

PPS。
想象一下你有一个可编辑的“矩形”的 MS Word 编辑器......如果你编辑矩形中的文本(在编辑模式下选择矩形),你的“Del”应该删除矩形中的字符,如果没有,它应该删除矩形本身...(如果选择了矩形)。

在我的情况下,我在矩形中处于编辑模式,我选择了一些文本,但是当我按 DEL 而不是删除文本时,会删除矩形本身....

【问题讨论】:

    标签: .net winforms events event-bubbling


    【解决方案1】:

    确保表单的 KeyPreview 属性设置为 False,这通常是表单的默认值。

    如果您有KeyPreview=true,可能的解决方法是检查活动控件并过滤表单对关键事件的处理:

    protected override void OnKeyDown(KeyEventArgs e) {
      if (ActiveControl.GetType() != typeof(TextBox)) {
        base.OnKeyDown(e);
      }
    }
    

    【讨论】:

    • 由于多种原因,我无法将 KeyPreview 设置为“False”,我需要寻找其他解决方案。
    • 即使 MyTextBox 在 MyPanel 上,并且 MyPanel 在 MyForm 上,当我按下 MyTextBox 中的“Del”按钮时,MyForm_KeyDown 事件上的“发送者”似乎是“MyForm”本身。 . (
    • 因为首先“Del”会在Form中被捕获,然后才会进入textBox...(
    • @serhio 由于KeyPreview=true,表单将首先处理事件,这就是我在示例中为表单事件添加“过滤器”的原因。
    • @serhio 您的“控件”需要以某种方式设置一个标志,表单可以使用该标志来确定是否处理删除键。您尚未共享任何代码,因此很难提供比这更多的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2017-01-17
    • 2012-03-14
    • 1970-01-01
    • 2012-04-01
    相关资源
    最近更新 更多