1

DevExpress BarManager を使用してメニューを構築していますが、以下に説明する問題が他のメニュー処理コンポーネントでも発生することがわかっています。

BarManager を使用して概念上の問題が発生しました。すべてのフォームが派生する基本フォーム クラスがあります。この基本フォームには BarManager があり、実際のところ、現在フォーカスされているコントロールによって通常処理されるショートカットを含め、発生するすべてのショートカットを処理します。もちろん、これは望ましい動作ではありません。次の例を考えてみましょう: テキスト ボックスがフォーカスされている場合、CTRL + C を押しても、テキスト ボックスのテキスト値がクリップボードにコピーされません。代わりに、BarManager が BarItemClick イベントを発生させます。

現在、この問題を一般的な方法で解決するためのいくつかの戦略を評価しています。私たちのフレームワークが問題を完全に処理し、個々のプログラマーやアプリケーションが問題を気にしないという要件があることは明らかです。したがって、次の例で提案されているソリューションは、アプリケーション固有のロジックに依存しているため、適用できません: example .

この問題を一般的に解決するには、基本的に次の 2 つの方法があることがわかりました。

  1. BarManager は、常に BarItemClick イベント ハンドラーでショートカットを処理します。コントロールがフォーカスされている場合、そのコントロールは、可能であればショートカットを処理するように指示されます。コントロールがショートカットを処理できなかった場合 (たとえば、ショートカットが CTRL + S であるため)、BarManager はイベントをアプリケーションに渡します (たとえば、現在のドキュメントを CTRL + S で保存します)。
  2. BarManager には、ショートカットが発生するたびに発生する ShortcutItemClick イベントがあります。それぞれのイベント ハンドラーで、フォーカスされたコントロールは、このショートカットを処理できるかどうかを尋ねられます。はいの場合 (例: CTRL + C)、BarManager はショートカットの処理をキャンセルし、コントロールは BarManager がまったくないかのようにショートカットに反応します (例: コントロールの内容をクリップボードにコピーします)。そうでない場合 (CTRL + S など)、BarManager がショートカットを処理します。つまり、BarItemClick イベントが発生し、アプリケーションがそれを処理します (現在のドキュメントを保存するなど)。

現在、各ソリューションについて、実装がどのように見えるかについていくつかのアイデアがありますが、それらはすべて満足のいく方法で機能していません。

ソリューション 1 の場合:

A) フォーカスされたコントロールで BaseEdit.SendKey() を呼び出します。実装するロジックがないため、これは最も自己完結型のソリューションです。問題は、BaseEdit.SendKey() を呼び出してショートカットのキーを渡しても効果がないことです。たとえば、SendKey(new KeyEventArgs(Keys.Delete)) は、フォーカスされたテキスト ボックスの選択を削除しません。私の質問は: なぜこのメソッド呼び出しは効果がないのですか?

B) 1 つのメソッド HandleShortcut() を持つインターフェイス IShortcutHandler を定義します。使用されるすべてのコントロールは、次の方法でインターフェイスを実装します。

public void HandleShortcut(KeyEventArgs args)
{
  base.OnKeyDown(args);
}

このソリューションには、A) と同様に、OnKeyDown を呼び出しても効果がないという問題もあります。私の質問は:これはなぜですか?

ソリューション 2 の場合:

A) コントロールがショートカットを処理できるかどうかを判断するコントロールのメソッドを呼び出します。私の質問は: そのようなメソッド、ヘルパー クラス、ライブラリ、または決定を下すことができるものはありますか?

他に考えられる戦略や解決策はありますか?

4

0 に答える 0