我想重新打造" Up"我的窗口在我的ViewModel上执行命令的键。
我的窗口包含2个控件:ListView,TextBox。
如果我这样做
<Window.InputBindings>
<KeyBinding Key="F5" Command={Binding SomeCommand} />
</Window.InputBindings>
一切正常。但是,如果我将其设置为&#34; Up&#34;或某些其他键,则如果TextBox具有焦点,则不会执行该命令。这告诉我TextBox正在处理这些键并吞下触发命令的事件。有没有办法阻止它,并允许窗口使它们类似于预览事件(PreviewKeyUp
)?
答案 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模式。