【问题标题】:Is TextBox behavior correct文本框行为是否正确
【发布时间】:2011-04-21 08:51:16
【问题描述】:

为什么 TextBox 使用 e.Handled = true 来防止输入特定字符。
难道我们没有更好的方法吗?
这不是错误的设计吗?

目前我不想收到 KeyDown 事件,如果特定的 TextBox 是焦点,有没有好的方法可以做到这一点?或者我必须检查 OriginalSource 我想要的 TextBox...

编辑:

看来我原来的问题有点混乱,让我改一下。
假设我们有一个 Canvas 和文本框作为 canvas 的子级。 我注册了画布的 keyDown 事件,在那里做一些非常有趣的事情。
我不想在用户输入 textBox 时收到 keydown 事件。 有没有办法在不涉及 e.OriginalSource 的情况下做到这一点?

【问题讨论】:

  • 您的问题是什么?不要对特定文本框使用 keydown
  • e.Handled = true 是最好的方法。
  • 假设您有 Canvas 和 TextBox 作为它的子项。我正在注册 Canvas 的 KeyDown 以做某事,但如果我输入 TextBox,我不想收到此 KeyDown。自然地将 e.Handled 设置为 true 将防止事件冒泡,但在 TextBox 情况下,我们将有不正确的行为。
  • 最后是 WPF 中事件冒泡的一个缺点,最初每个人似乎都对此感到头晕目眩。好像你给我制造了一个无法解决的问题。您已经知道解决方案,只是不想使用它,因为它看起来“不优雅”。
  • 终于有人了解我了。我做了一些研究,但我无法做到这一点。我认为文本框可能会在内部调用框架元素的 Addhandler,但事实并非如此。

标签: c# silverlight


【解决方案1】:

如果您想阻止 任何 输入,您也可以(实际上,应该)设置 ReadOnly = true 而不是监听 KeyDown 事件。

如果你想有选择地防止击键,听KeyDown和设置e.Handled是唯一的方法。

但是,选择性地防止击键对于可用性不好;不要这样做。而是使用文本框控件的Validating event 来验证用户输入。

【讨论】:

  • 如果我想注册 textbox parent 的 keydown,但如果是特定的 textBox,我不想获取事件?
  • @Sonosar 那么在这种情况下,只需不要设置e.Handled属性。
  • 你确定你明白我在说什么吗?不设置 e.Handled 会导致实际上在 Parent 中获得 keydown 事件。为什么文本框关心 e.Handled 是真的?
  • @Sonosar “你确定你明白我在说什么吗?” - 不。在阅读了您在问题下的评论后,我现在这样做了。老实说,我对这个问题没有很好的答案。我建议编辑您的问题并包含该评论(实际上,您可以替换整个问题),以便更明显。
  • 非常抱歉,因为我无法正确提出我的问题,我会在一分钟内更新我原来的问题。感谢您的重播。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 2012-08-18
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多