MvvmCross

问题描述

我刚刚开始使用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);

这是最好的方法,我不知道。