如何阻止Control-I在CoreWindow范围内的UWP TextBox中插入选项卡?

时间:2016-01-27 18:43:36

标签: c# textbox uwp windows-10-universal

当我在UWP应用程序中有一个TextBox时,对我来说是个奇怪的行为。

  • 在Windows 10中创建通用的空白应用程序UWP应用程序。
  • 使用以下代码将TextBox添加到默认网格:
    <TextBox Text="There's not much spam in it" Name="textBox" />
  • 构建并运行应用程序。
  • 点击TextBox内部
  • Type Control-I。

插入了一个标签。

导致此行为的原因是什么?

我试图通过将处理程序挂钩到Window.Current.CoreWindow.KeyDown来尝试在Windows 10应用程序中设置窗口级快捷方式,但我认为在事件游戏中抓住控件太晚了 - 我的标签插入并调用它处理。那,我认为TextBox的KeyDown在CoreWindow事件发生之前就完全处理了。

所以现在,只要有人选择Control,我就会决定在每个 TextBox上处理事件 - 我喜欢这个...

将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;
    }
}

...这似乎工作正常,除了现在我必须打我的&#34;窗口&#34;将Control-I的范围事件处理程序放入每个TextBox (或扩展TextBox,这两个对于看似非标准的键盘快捷方式看起来都很疯狂)。

所以主要是我在询问按下Control-I时将Tab插入TextBox是什么动作,以及是否有更好的方法可以避免在CoreWindow级别执行该操作。在CoreWindow级别捕获键盘快捷键的更好方法(例如,Ctrl-K意味着插入一个链接)也会受到赞赏,但不会真正回答真实的&#34;真实的&#34;问题

1 个答案:

答案 0 :(得分:1)

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

我在GitHub上有一个更全面的解决方案可以解决这个问题以及其他一些问题here,但这里是有效的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.");
}