【问题标题】:How do you detect a square bracket in a KeyDown or KeyUp WPF event?如何在 KeyDown 或 KeyUp WPF 事件中检测方括号?
【发布时间】:2013-06-01 05:31:16
【问题描述】:

我想检测击键是否会导致在 WPF PopupKeyDown 事件中关闭 square bracket ]

private void MyPopup_KeyDown(object sender, KeyEventArgs e)
{
    if (theKeyStrokeWouldResultIsAClosingSquareBracket)
    {
        // ...
        // do stuff
        // ...
        e.Handled = true;
    }
}

该解决方案必须适用于任何键盘布局。请注意,不同布局的键映射通常差异很大。因此,不幸的是,检查正确的组合键(例如德国键盘上的QWERTZ 键盘上的Ctrl + Alt + Digit 9 或美国QUERTY 键盘上的简单OemCloseBrackets)是没有解决办法的。

尽管存在这些问题,您如何完成这样的检测?


编辑 - 在开始赏金之前添加一些信息:

我目前正在我当前的项目中实现类似 IntelliSense 的功能。 IntelliSense 的灵感来自于:http://www.codeproject.com/Articles/22803/Intellisense-like-Method-Selection-Pop-up-Window

自定义语法允许像[abc].[def] > [ghi].[jkl] 这样的表达式,用户应该能够让智能感知函数自动完成括号中的文本。为了使智能感知功能更类似于 Visual Studio(以及许多其他 IDE)的行为,我想让用户在弹出的列表框中键入右方括号以强制自动完成。

【问题讨论】:

  • 你试过if (e.KeyCode == Keys.OemCloseBrackets)吗?
  • 是的。但是,正如我在问题中所写,这是特定于美国 QWERTY 布局(和类似布局)的,并且在这方面不适用于与该键盘不同的其他布局。
  • 也许您应该监听 TextInput 而不是尝试处理 KeyDown,这样您就不需要处理键盘翻译。

标签: c# wpf keyboard wpf-controls


【解决方案1】:

您应该使用 PreviewTextInput 事件 - 这将获得一个 TextCompositionEventArgs 参数,其 Text 属性将是右括号。

【讨论】:

  • 好吧,毕竟这很容易。非常感谢您的提示!
【解决方案2】:

您可以在弹出窗口中添加一个透明的TextBox,并订阅TextChanged 事件而不是Popup 上的事件。

【讨论】:

  • 虽然这听起来有点脏,但实际上会有所帮助。感谢您的建议。不过,在接受这个答案之前,我会等待其他一些答案。
  • 绝对脏 :) 我对 Silverlight 的体验比 WPF 更多,但我把它比作《绝命毒师》。首先,一切都美好而美好,但你越走越远,你需要依靠的肮脏伎俩就越多,以解决生活的局限性。
  • +1 有时你必须做你必须做的事!简单、廉价/易于实施。
【解决方案3】:

如果它是一个组合键,我认为您无法使用按键事件来捕获它。

如果(e.Key == Key.OemCloseBrackets) {

}

是使用英文键盘的简单案例的正确方法。如果您想处理您所描述的德语键盘,您应该对您正在使用的从按键事件调用的文本框进行字符串比较。

if (txtKeypad.Text.Substring(txtKeypad.Text.Length - 1, 1) == "]")

我希望这会有所帮助。

埃德

【讨论】:

  • 感谢您的建议。不幸的是,我没有正在使用的TextBox。事件处理程序直接位于弹出窗口中。而且 Popup 不包含任何带有用户可编辑文本的控件。
  • txtKeypad.Text.EndsWith("]") 会更简单。您的代码还需要检查 .Lenght > 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 2012-02-08
  • 2013-08-02
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多