如何阻止 Control-I 在 CoreWindow 作用域的 UWP 文本框中插入选项卡

本文关键字:文本 插入 选项 UWP Control-I 何阻止 CoreWindow 作用域 | 更新日期: 2023-09-27 18:32:07

当我在 UWP 应用中有一个文本框时,奇怪的行为(对我来说)。

  • 在 Windows 10 中创建通用的空白应用 UWP 应用。
  • 使用以下代码将文本框添加到默认网格:
    <TextBox Text="There's not much spam in it" Name="textBox" />
  • 生成并运行应用程序。
  • 在文本框内单击
  • 类型控制-I。

将插入一个选项卡。

是什么导致了这种行为?

我正在尝试通过将处理程序连接到Window.Current.CoreWindow.KeyDown来在 Windows 10 应用程序中设置窗口级快捷方式,但我认为在事件游戏中为时已晚,无法捕获 Control-I 的选项卡插入并调用它处理。我认为TextBox的KeyDown在CoreWindow事件发生之前就完全处理了。

所以现在我正在解决每个文本框上的事件,只要有人选择 Control-我喜欢这个......

将 XAML 编辑为此:

<TextBox Text="There's not much spam in it" 
    Name="textBox" KeyDown="textBox_KeyDown" AcceptsReturn="True" />

添加事件处理程序:

private void textBox_KeyDown(object sender, KeyRoutedEventArgs e)
{
    if (e.OriginalKey.Equals(VirtualKey.I) 
        && Window.Current.CoreWindow.GetKeyState(VirtualKey.Control)
        .HasFlag(CoreVirtualKeyStates.Down))
    {
        this.textBox.SelectedText += "X";
        e.Handled = true;
    }
}

。这似乎工作正常,除了现在我必须将 Control-I 的"窗口"范围事件处理程序放入每个文本框中(或扩展 TextBox,这两者都对于似乎是非标准键盘快捷键来说似乎很疯狂)。

因此,我主要问的是,当按下 Control-I 时,将选项卡插入文本框的操作是什么,以及是否有更好的方法可以在 CoreWindow 级别避免该操作。在 CoreWindow 级别捕获键盘快捷键的更好方法(例如,Ctrl-K 表示插入链接)也将不胜感激,但不会真正回答"真正的"问题。

如何阻止 Control-I 在 CoreWindow 作用域的 UWP 文本框中插入选项卡

迄今为止,我发现的最佳解决方案是为KeyDown插入一个将吃 Ctrl-I 的事件处理程序。

我在 GitHub 上有一个更完整的解决方案,可以解决这个问题和其他一些问题,但这里是操作 Ctrl-I 吃代码:

public UWPBox() : base()
{
    this.KeyDown += this.KeyDownHandler;
}
public virtual async void KeyDownHandler(object sender, KeyRoutedEventArgs e)
{
    bool isCtrlDown = Window.Current.CoreWindow.GetKeyState(VirtualKey.Control)
        .HasFlag(CoreVirtualKeyStates.Down);
    try
    {
        switch (e.OriginalKey)
        {
            case VirtualKey.I:
                // First, kill the default "Ctrl-I inserts a tab" action.
                if (isCtrlDown)
                {
                    e.Handled = true;
                    this.HandleCtrlI(); // Just in case we want to do 
                                        // something different with Ctrl-I
                }
                break;
            // "Fixes" for Ctrl-V and Tab removed.
            // Fuller solution here: https://github.com/ruffin--/UWPBox
        }
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(
            DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + ": " 
            + ex.Message);
    }
}
public virtual void HandleCtrlI()
{
    System.Diagnostics.Debug.WriteLine("Ctrl-I pressed.");
}