通过 Unicode 编码检查 TextCompositionEventArgs.ControlText

Checking TextCompositionEventArgs.ControlText by Unicode encoding

我正在看一本书中的一个 WPF 示例,其中 OnPreviewTextInput 在派生自 Window 的 class 中被覆盖。覆盖根据 Unicode 文字字符 '\u000F' 检查 TextCompositionEventArgs.ControlText 字符串。这对应于用户按下 Ctrl+O。

字符 '\u000F' 对我来说看起来像 "magic" 字面意思。如果我想检查其他代码,我怎么知道要检查什么?有没有更 reader 友好的方法来做到这一点?

protected override void OnPreviewTextInput(TextCompositionEventArgs e)
{
    // Ctrl+O
    if (e.ControlText.Length > 0 && e.ControlText[0] == '\u000F')
    {
        // do stuff
    }
}

如您所料,它是一个 "magic" 文字。但魔术背后有一些逻辑和历史。它对应于一个叫做 Control characters 的旧概念(长读,只有在你感兴趣的时候)。

快速参考0x0F如何对应Ctrl-Osee this table. Focus on the first column with the caret notation;您会看到字符 1-26 (0x01-0x1A) 将 Ctrl-A 映射到 Ctrl-Z。字符 15(或 0x0F)是您的 Ctrl-O

这些旧的 ASCII 控制代码被引入了 Unicode,并保留了它们的映射。因此你的 '\u0000F'.

如果您在 Internet 上的时间足够长,您会看到一些愚蠢的 ^H^H^H^Hawesome 笑话,这些笑话依赖于 ^H 映射到 Backspace 控制字符的神秘知识。您实际上可以尝试其中的一些。启动记事本,您会看到 Ctrl-ICtrl-M 映射到相应的 Tab 和 Enter。

使用Keyboard.IsKeyDown方法应该使代码更具可读性:

protected override void OnPreviewTextInput(TextCompositionEventArgs e)
{
    // Ctrl+O
    if ((Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
        && Keyboard.IsKeyDown(Key.O))
    {
        //...
    }
}