[英]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.