2016-12-20 3 views
0

MVVMパターンを使用してwpfアプリケーションを開発しています。鍵の押下&のリリースイベントを個別に処理する必要があります(たとえば、メディアプレーヤーのfwd/revは、離したときにユーザーがキーを押したままになるまで、&が停止するまで発生します)。 多くの検索を行った後も、それを行う方法は見つけられませんでした。誰でも助けてください。MVVMの主要なプレス&リリースイベントの処理

+0

あなたのビューモデルに格納されているコマンドの呼び出しにそれらのUIイベントを翻訳することができますhttp://stackoverflow.com/questions/4897775/wpf-binding-ui-events-to-commands-in-viewmodel –

+0

ここから始めてください。問題がある場合は、https://msdn.microsoft.com/en-us/library/system.windows.input.inputmanager(v=vs.110).aspxに戻ってください。 – Will

答えて

0

ご意見ありがとうございます。 対話性トリガー&依存プロパティを使用してこれを行う方法が見つかりました。 次は、Commandの依存関係プロパティです。

public class EventToCommand : TriggerAction<DependencyObject> 
{ 
    public ICommand Command 
    { 
     get { return (ICommand)GetValue(CommandProperty); } 
     set { SetValue(CommandProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for Command. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty CommandProperty = 
     DependencyProperty.Register("Command", typeof(ICommand), typeof(EventToCommand), new PropertyMetadata(null)); 

    protected override void Invoke(object parameter) 
    { 
     if (Command != null 
      && Command.CanExecute(parameter)) 
     { 
      Command.Execute(parameter); 
     } 
    } 
} 

それからちょうど次のようにXAMLでそれを使用する:KeyReleaseCommand & KeyDownCommandがあなたのViewModelにRelayCommandある

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="KeyUp"> 
     <ap:EventToCommand Command="{Binding KeyReleaseCommand}"></ap:EventToCommand> 
    </i:EventTrigger> 
    <i:EventTrigger EventName="KeyDown"> 
     <ap:EventToCommand Command="{Binding KeyDownCommand}"></ap:EventToCommand> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

public MainViewModel() 
    { 
     KeyDownCommand = new RelayCommand<KeyEventArgs>(OnKeyDown, null); 
     KeyReleaseCommand = new RelayCommand<KeyEventArgs>(OnKeyRelease, null); 
    } 

    private void OnKeyRelease(KeyEventArgs args) 
    { 
     if (args.KeyboardDevice.Modifiers == ModifierKeys.Alt) 
     { 
      if (args.SystemKey == Key.Left) 
      { 
       Trace.WriteLine("ALT+LEFT Released"); 
      } 
     } 
    } 

    public void OnKeyDown(KeyEventArgs args) 
    { 
     if (args.IsRepeat) 
      return; 

     if (args.KeyboardDevice.Modifiers == ModifierKeys.Alt) 
     { 
      if(args.SystemKey == Key.Left) 
      { 
       Trace.WriteLine("ALT+LEFT"); 
      } 
     } 
    } 
0

私は、CommandButtonにバインドすると思います。コマンドを繰り返し実行する場合は、RepeatButtonを使用できます。その目的のために設計されました。コマンドをCommandプロパティにバインドできます。 RepeatButtonがリリースされるまで、あなたのメソッドを繰り返し実行します。

関連する問題