2011-02-24 11 views
0

コントロールA、コピー貼り付けなどのコマンドでRoutedCommandsを使用していて、すべてうまく動作します。 次に、四つのroutedコマンドを追加して、矢印キーを使ってオブジェクトをキャンバスの左右に移動させました。時にはうまく動作しません。最初はCanvasのFocus問題だと思っていましたが、同時に、control-Aのような他のルーティングコマンドはすべて動作しますが、矢印はそうではありません。 私は実際に何が起こっているのか分かりません。異なる変数名を持つ同じroutedコマンドです。どのように100%の時間が働き、1つが時間の50%しか働かないのですか?WPFルーテッドコマンドのみが起動する場合があります

ワーキングRoutedCommandの:

_bindings.Add(new CommandBinding(DesignerCanvas.SelectAll, SelectAll_Executed)); 
SelectAll.InputGestures.Add(new KeyGesture(Key.A, ModifierKeys.Control)); 

private void SelectAll_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    SelectionService.SelectAll(); 
} 

誤動作RoutedCommandの:

_bindings.Add(new CommandBinding(DesignerCanvas.MoveDown, MoveDown_Executed)); 
MoveDown.InputGestures.Add(new KeyGesture(Key.Down)); 

private void MoveDown_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    e.Handled = true; 
    var selectedItems = from item in SelectionService.CurrentSelection.OfType<DesignerItem>() 
          select item; 

    if (selectedItems.Count() > 0) 
    { 
     for (int i = 0; i < selectedItems.Count(); i++) 
      selectedItems.ElementAt(i).Top += Option.OptionSingleton.Sensitivity; 
    } 
} 

誤動作RoutedCommandのは、ちょうどそれが、その後、私はいくつかの他のウィンドウを開き、戻ってキャンバスに来て、特に後に、ときどきます発射されていません他の経路指定コマンドが影響を受けない間に発射を停止する。この奇妙な行動を引き起こしているものは何ですか?

答えて

1

フォーカスに問題があったことが判明しました。マウスが入るたびにフォーカスをキャンバスに設定しました。今は固定されています。回答いただきありがとうございます。

2

あなたはsometiemsがイベントのルートをトレースすることは非常に包括的クラスのイベントハンドラを使用することができます。

EventManager.RegisterClassHandler(typeof(FrameworkElement), CommandManager.CanExecuteEvent, 
    new CanExecuteRoutedEventHandler((s, e) => Debug.WriteLine("CanExecute: " + s)), true); 
EventManager.RegisterClassHandler(typeof(FrameworkElement), CommandManager.ExecutedEvent, 
    new CanExecuteRoutedEventHandler((s, e) => Debug.WriteLine("Executed:" + s)), true); 
EventManager.RegisterClassHandler(typeof(FrameworkElement), CommandManager.ExecutedEvent, 
    new CanExecuteRoutedEventHandler((s, e) => Debug.WriteLine("KeyDown:" + s)), true); 

あなたのケースでは、それが結合コマンドに到達する前に、KeyDownイベントを処理することができるかCanExecuteイベントはそれに達していなくてもよいです何か他の理由で。

がうまくいけば、これはあなたが

1

これが起因し得る使用しているキーが「ダウン」キーであるという事実のために問題をデバッグするのに役立ちます。私はあなたが別のキーを使用した場合、それは動作するだろうと思う。

一部のコントロールは、矢印キーとページアップ/ページダウンキーを消費します。たとえば、TextBoxはこれを行います。キャンバスがスクロールビューワにある場合、スクロールビューワがそれを食べている可能性があります。

この2つの回避策があります。

  1. はキージェスチャーを食べているコントロールにバインドを追加します。
  2. Handleキーキャンバス(またはキーストロークを摂っているコントロールの親)のプレビューを表示し、そこからコマンドを実行します。

this questionへの答えは、各コマンドのKeyPreviewのハンドラ内で特定のコードを記述せずに#2を行うことができます方法を示しています。

関連する問題