【问题标题】:WPF: How to have KeyBinding on Window that doesn't get swallowed by textboxWPF:如何在不被文本框吞噬的窗口上设置 KeyBinding
【发布时间】:2017-01-21 04:54:38
【问题描述】:

我想为我的窗口重新绑定“向上”键以在我的 ViewModel 上执行命令。

我的窗口包含 2 个控件:ListView、TextBox。

如果我这样做

<Window.InputBindings>
    <KeyBinding Key="F5" Command={Binding SomeCommand} />
</Window.InputBindings>

一切正常。但是,如果我将其设置为“向上”或某些其他键,则如果 TextBox 具有焦点,则不会执行该命令。这告诉我 TextBox 正在处理这些键并吞下触发命令的事件。有什么办法可以防止这种情况发生并允许窗口让它们类似于预览事件(PreviewKeyUp)?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    如果你想要一个应用级的快捷方式,你可以使用 InputManager

    InputManager.Current.PreProcessInput += (sender,args)
    {
        var keyboardEvent = args?.StagingItem?.Input as KeyboardEventArgs;
    
        if(keyboardEvent != null)
        {
            var keyArgs = keyboardEvent.RoutedEvent as KeyEventArgs;
    
            if(keyArgs != null)
            {
                if(keyArgs.Key == Key.F5)
                {
                    // Do something
                }
            }         
        }
    };
    

    我建议采用上述逻辑并将其合并到您可以将键绑定/映射到命令的行为中。

    【讨论】:

    • 所以在这个设置中,我会手动映射键并执行类似commands[matchingCommandKey].Execute(parameter)?我现在有类似的东西,没有使用InputManager,我只是在窗口上使用 PreviewKeyPress,但我的想法是尝试利用命令框架
    • 是的。我求助于 InputManager 以避免焦点/捕获问题。它似乎贯穿了整个应用程序。
    【解决方案2】:

    有什么方法可以防止这种情况发生并允许窗口获取它们类似于预览事件 (PreviewKeyUp) 吗?

    您可以使用接受“handledEventsToo”布尔参数的 AddHandler 方法的重载将事件处理程序连接到 KeyDownEvent,并从该事件处理程序调用您的命令:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            var vm = new ViewModel();
            DataContext = vm;
            AddHandler(KeyDownEvent, new KeyEventHandler((ss, ee) => 
            {
                vm.SomeCommand.Execute(null);
            }), true);
        }
    }
    

    虽然在纯 XAML 中没有办法做到这一点,但就 MVVM 模式而言,这并不重要,因为您只需将命令的调用从视图的 XAML 标记移动到代码隐藏相同视图的类。这不会破坏 MVVM 模式。

    【讨论】:

      猜你喜欢
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多