问题描述
我刚刚开始使用mvvmCross,想知道如何捕获特定的键盘按键,无论我在应用程序中的任何位置,都可以按此按键。
我会将侦听器放在viewmodel类(公共类Testviewmodel:Mvxviewmodel)中
通常,您会用类似的方式做到这一点;
private void Window_PreviewKeyDown(object sender,KeyEventArgs e)
{
if (e.Key == Key.F5)
{
//refresh
}
}
但是KeyEventArgs在此框架中是未知的。我也没有在他们的网站上找到任何信息。
谢谢
斯蒂芬
根据建议,我在MainWindow WPF中添加了以下代码:
this.KeyDown += (s,e) =>
{
System.Diagnostics.Debug.WriteLine("Key pushed: " + e.Key);
if (e.Key == Key.F5)
{
System.Diagnostics.Debug.WriteLine("F5 was pressed in View");
}
};
public IMvxCommand Update@R_784_4045@ionCommand { get; set; }
Update@R_784_4045@ionCommand = new MvxCommand(AddGuest); //in the constructor
当我按F5时,会获得正确的控制台输出,但是我不确定如何触发Update@R_784_4045@ionCommand命令。在WPF中,只需将命令添加到按钮上似乎很容易,但是我不知道如何以编程方式完成
更新: 我加了:
<views:MvxWpfView.InputBindings>
<KeyBinding Key="F5" Command="{Binding Update@R_784_4045@ionCommand}" />
</views:MvxWpfView.InputBindings>
进入我的视图,但是现在的问题是,我可以通过单击SomeView内的控件来更改MainWindow.xaml的焦点,但是我仍然沉迷于如何通过代码更改焦点。我也尝试过:
FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}">
解决方法
我认为这应该在特定平台上实施。因此,对于WPF,您应该可以执行以下操作:
public new SomeViewModel ViewModel
{
get { return (SomeViewModel)base.ViewModel; }
set { base.ViewModel = value; }
}
// constructor
public SomeView()
{
this.KeyDown += (s,e) =>
{
switch (e.Key)
{
case VirtualKey.Number0:
ViewModel.UpdateInformationCommand.Execute();
break;
case VirtualKey.Number1:
ViewModel.UpdateInformationCommand.Execute();
break;
// etc
}
};
}
如果您希望每个视图都具有此视图,则可以使其成为基本视图。
,我“解决”了Messenger的问题。 首先,我为MainWindow创建了一个ViewModel,它从MainWindow.xaml接收命令 将viewmodel与我添加代码的视图连接
this.DataContext = new MainWindowViewModel();
到MainWindowView.xaml.cs
第二,我使用Messenger创建服务并将其发布:
_messenger.Publish(message);
最后,我在InformationViewModel中订阅了该事件:
_token = messenger.Subscribe<KeyboardMessage>(OnLocationMessage);
这是最好的方法,我不知道。