簡體   English   中英

WPF:如何在不被文本框吞噬的窗口上設置鍵綁定

[英]WPF: How to have KeyBinding on Window that doesn't get swallowed by textbox

我想重新綁定窗口的“向上”鍵以在ViewModel上執行命令。

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

如果我做

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

一切正常。 但是,如果將其設置為“ Up”或某些其他鍵,則如果TextBox具有焦點,則該命令將不會執行。 這告訴我TextBox正在處理這些鍵並吞下了觸發命令的事件。 有什么方法可以防止這種情況,並允許窗口獲取類似於Preview事件( PreviewKeyUp )的信息?

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

我建議您采用上述邏輯並將其合並為可以將鍵綁定/映射到命令的行為。

有什么方法可以防止這種情況,並允許窗口獲取類似於Preview事件(PreviewKeyUp)的信息?

您可以使用AddHandler方法的重載將事件處理程序連接到KeyDownEvent,該方法接受“ handledEventsToo”布爾參數,並從此事件處理程序調用命令:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM