WPF:如何让Window上的KeyBinding不被文本框吞噬

时间:2017-01-20 16:28:29

标签: c# wpf

我想重新打造" Up"我的窗口在我的ViewModel上执行命令的键。

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

如果我这样做

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

一切正常。但是,如果我将其设置为&#34; Up&#34;或某些其他键,则如果TextBox具有焦点,则不会执行该命令。这告诉我TextBox正在处理这些键并吞下触发命令的事件。有没有办法阻止它,并允许窗口使它们类似于预览事件(PreviewKeyUp)?

2 个答案:

答案 0 :(得分:0)

如果需要应用程序级快捷方式,可以使用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
            }
        }         
    }
};

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

答案 1 :(得分:0)

  

有没有办法阻止它并允许窗口使它们类似于预览事件(PreviewKeyUp)?

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

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模式。