2011-08-09 8 views
1

Visual Studio 2010の機能と同様のメニューとコンテキストメニューのアーキテクチャを使用して、現在のメニューを拡張機能によって提供されるサブアイテムとともに拡張できます。私はMEF(Managed Extensibility Framework)を使用しています。 例として、Resharper拡張機能は、メニュー項目とコンテキストメニュー項目を任意の位置(コンテキストメニューの上部、中央または下部、またはメニュー項目)に追加します このような機能を提供するにはどうすればよいですか?シェルのすべての単一メニュー項目にインデックスを付ける必要がありますし、そのサブ項目を配置するためにインデックスを参照する拡張機能を持っていなければなりませんか? 私の質問が十分に明確であることを願っています。もしそうでなければ、私はいくつかの説明を追加して満足しています。MEFを使用した.NETアプリケーションでのメニューとコンテキストメニューの拡張

答えて

0

私はこれを行うための最善の方法はないと思います。

非常に単純な解決策は、単一の契約(すなわちIMenuIten)を使用し、メタデータを使用してコマンドがどのメニューに表示され、どの位置に表示されるのかを制御することです。これを行うための1つの方法は、おそらく二重であり、各項目がメニュー内の絶対位置を知る必要がないようにメニュー内の項目をソートするために使用されるべきであるが、「索引」を有することである。別の方法は、現在のアイテムの前後にあるべき他のアイテムのリストを与えるメニューアイテムにメタデータを持たせることです。次に、メニューアイテムをトポロジカルソートして表示するように指示することができます。

メニューの動作を複雑にするか動的にするかによって、書き出しを使用してうまく表現できないことがありますメタデータ。この場合、機能を契約自体に移すことができます。つまり、IMenuItemコントラクトのプロパティやメソッドを追加することができます。そうすれば、コードを実行して必要な値を計算することができます。

もう1つの解決策は、メニュー項目を直接エクスポートすることではありません。代わりに、コンポーネントによってインポートされるメニューサービスを持つことができます。サービスには、メニュー項目をメニューに追加するRegisterメソッドがあります。私の意見では、これはメニュー項目をかなり煩雑にしてしまうので、必要がある場合を除いてはお勧めしません。使用可能なメニュー項目がアプリケーションの現在のコンテキストに基づいて変更される必要がある場合は、適切かもしれません。このようにすると、メニューサービスをインポートするクラスを持つだけで、クラスが作成されて作成されることはありません。クラスは、システム内の他の場所にインポートされたものをエクスポートする必要があります。

関連する問題