0

control-A、コピー、貼り付けなどのコマンド用のRoutedCommandがいくつかあり、それらはすべて正常に機能します。次に、矢印キーを使用してオブジェクトをキャンバス内で上下に移動する4つのroutedコマンドを追加しました。これらのコマンドは機能する場合と機能しない場合があります。最初はCanvasのフォーカスの問題だと思っていましたが、同時に、control-Aのような他のすべてのルーティングされたコマンドは機能しますが、矢印キーは機能しないことがわかりました。ここで何が起こっているのか本当にわかりません。これらは異なる変数名を持つ同一のroutedコマンドですが、どうして1つは100%の時間で機能し、もう1つは50%の時間しか機能しないのでしょうか。

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が時々起動しない場合があります。特に、他のウィンドウを開いてキャンバスに戻った後は、他のroutedcommandが影響を受けない間、起動が停止します。この奇妙な振る舞いを引き起こしているアイデアはありますか?

4

3 に答える 3

2

これは、使用しているキーが「下」キーであることが原因である可能性があります。別のキーを使用すれば、うまくいくと思います。

一部のコントロールは、矢印キーとPageUp/PageDownキーを使用します。たとえば、TextBoxはこれを行います。キャンバスがscrollviewerにある場合、scrollviewerがそれを食べている可能性があります。

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

  1. キージェスチャを食べているコントロールにバインディングを追加します。
  2. Canvas(またはキーストロークを消費しているコントロールの親)のKeyPreviewを処理し、そこからコマンドを実行します。

この質問への回答は、各コマンドのKeyPreviewハンドラーに特定のコードを記述せずに#2を実行する方法を示しています。

于 2011-02-25T07:57:17.177 に答える
2

非常に包括的なクラスのイベントハンドラーを使用して、イベントのルートを追跡することができます。

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イベントが他の理由で到達しない可能性があります。

うまくいけば、これはあなたが問題をデバッグするのに役立つでしょう

于 2011-02-24T23:25:20.983 に答える
1

これはフォーカスの問題であることが判明しました。マウスが入るたびにフォーカスをキャンバスに設定するだけで、修正されました。答えてくれてありがとう。

于 2011-02-28T16:26:56.503 に答える