【问题标题】:UWP - Make a keyboard shortcut call a function without using controls?UWP - 使键盘快捷键调用函数而不使用控件?
【发布时间】:2019-08-07 13:25:33
【问题描述】:

我有这个用户可以输入的多行文本框。当他们按下“Ctrl + 1”时,它应该在文本框中插入一个特定的字符,比如这个太阳符号 ☼。我在网上搜索并在Microsoft keyboard accelerators documentation 中找到了类似这样的示例,其中键盘快捷键触发了按下按钮。但在我的情况下,我不想要按钮。

  <AppBarButton 
    Icon="Share" 
    Label="Share" 
    Click="OnShare" 
    AccessKey="S" />
  <AppBarButton 
    Icon="Copy" 
    Label="Copy" 
    ToolTipService.ToolTip="Copy (Ctrl+C)" 
    Click="OnCopy" 
    AccessKey="C">
    <AppBarButton.KeyboardAccelerators>
      <KeyboardAccelerator 
        Modifiers="Control" 
        Key="C" />
    </AppBarButton.KeyboardAccelerators>
  </AppBarButton>

【问题讨论】:

  • 听起来应该是文本框上的事件处理程序 - 可能是按键 - 监视键和修饰符的特定组合键。
  • WPF/UWP 在设计时考虑了 MVVM 模式。虽然您可以使用其他方法,但这会丢失大约 90% 的功率并很快遇到问题。缺少命令表明这可能不是 MVVM。使用 MVVM,这整个操作可能属于 ViewModel,它必须为它公开一个适当的命令。如果不知道那个角色做了什么,就很难说清楚。几年前我写了一篇关于 MVVM 的介绍,似乎仍然是一个有效的起点:social.msdn.microsoft.com/Forums/vstudio/en-US/…

标签: c# uwp


【解决方案1】:

您可以在页面(如MainPage)上注册快捷事件。

public MainPage()
{
    this.InitializeComponent();
    Window.Current.Dispatcher.AcceleratorKeyActivated += AccelertorKeyActivedHandle;
}

private async void AccelertorKeyActivedHandle(CoreDispatcher sender, AcceleratorKeyEventArgs args)
{
    if (args.EventType.ToString().Contains("Down"))
    {
        var ctrl = Window.Current.CoreWindow.GetKeyState(Windows.System.VirtualKey.Control);
        if (ctrl.HasFlag(CoreVirtualKeyStates.Down))
        {
            if (args.VirtualKey == Windows.System.VirtualKey.Number1)
            {
                // add the content in textbox
            }
        }

    }
}

此注册方式为全局注册,满足触发条件即可运行相关函数。

最好的问候。

【讨论】:

  • 如果我需要另一个快捷键,比如“Ctrl + 2”,我可以将它添加到当前的 AccelertorKeyActivedHandle 中还是必须创建一个单独的“AccelertorKeyActivedHandle2”
  • 顺便说一句,感谢您提供此代码。我不知道你是怎么想出来的,但我在网上没有找到类似的东西。
  • 如果需要添加另一个快捷键,假设Ctrl加另一个按钮,可以追加else if(args.VirtualKey == Windows.System.VirtualKey.[OtherKey])
  • 这真是太棒了。你是个巫师。
【解决方案2】:

尝试在您的代码中编写一个函数,当一组特定的键被同时按下时触发。 例如,如果您想在用户按下“Ctrl + 1”时打印一个 ? 表情符号, 编写一个函数或一段代码,当按下 Ctrl 和 1 时触发 一起并在多行文本框中附加文本,光标处带有 ? 表情符号 位置。 我希望这会有所帮助。

【讨论】: