4

サードパーティのコントロールから派生しています。ApplicationCommands.SelectAllを実装しています。しかし、私が望む振る舞いは少し異なります。オーバーライドできる仮想メソッドはありません。クラスハンドラーを登録すると、次のようになります。

     CommandManager.RegisterClassCommandBinding(typeof(MyDerivedControl), new CommandBinding(ApplicationCommands.SelectAll, new ExecutedRoutedEventHandler(OnExecutedSelectAll), new CanExecuteRoutedEventHandler(OnCanExecuteSelectAll)));

私のメソッドは呼び出されません。私が派生しているサードパーティのコントロールはマーキングです

e.Handled=true;

そのコマンドハンドラーで(私はこの原因を知っていますが、ソースを見ましたが、それを変更することはできません)

私に何ができる?

4

1 に答える 1

6

3つのオプションがあります。

1)CommandBindingを登録して、通常のイベントの代わりに、または通常のイベントに加えてプレビューイベントを処理できます。

CommandBinding cb = new CommandBinding(ApplicationCommands.SelectAll);
cb.PreviewCanExecute += OnCanExecuteSelectAll;
cb.PreviewExecuted += OnExecutedSelectAll;

ただし、注意してください。PreviewExecutedを登録している場合、CommandBindingを介してハンドラーを登録すると、e.Handledをfalseに明示的に設定しても、Executedハンドラーは実行されません。ただし、PreviewCanExecute/CanExecuteのイベントのペアでは期待どおりに機能します。これは、CommandBindingクラスを実装する方法です。
したがって、基本クラスのコマンドハンドラーを実行したくない場合にのみ、PreviewExecutedを使用してください。

2)または、CommandManagerを介してコマンドハンドラーを直接登録することもできます。

CommandManager.AddPreviewCanExecuteHandler(this, OnCanExecuteSelectAll);
CommandManager.AddPreviewExecutedHandler(this, OnExecutedSelectAll);

ただし、これはクラスハンドラーではないため、インスタンスごとに実行する必要があります。次に、ハンドラーで天気を確認する必要があります。これは、関心のあるコマンドです(イベント引数にコマンドへの参照があります)。注:引き続きCommandBindingを登録する必要がありますが、CommandManagerに直接ハンドラーを追加するだけの場合は、そのCommandBindingにハンドラーを登録する必要はありません。

3)または、少しハックすることもできます(実際にはハックではありません):

this.AddHandler(CommandManager.CanExecuteEvent, new CanExecuteRoutedEventHandler(OnCanExecuteSelectAll), true);
this.AddHandler(CommandManager.ExecutedEvent, new ExecutedRoutedEventHandler(OnExecutedSelectAll), true);

このようにして、コマンドイベントハンドラーを登録して、既に処理されている場合でも実行されるようにします。
上記のポイントと同様に、CommandManagerイベントを発生させるには、コマンドバインディングを登録する必要があります。
これは、上記のポイント2とほぼ同じですが、CommandManager.Add[4つのイベントの1つ]Handlerを呼び出すと、コマンドマネージャーは2つの引数バージョンを使用してコントロールのAddHandlerを呼び出します。

于 2010-03-16T18:31:45.723 に答える