日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。NavigationFrameworkのお話。MEFを使うと、動的に読み込んだXAPからクラスのインスタンスを取得したり出来るけど、これがNavigationFrameworkと、すこぶる相性が悪いです。悪いかって、例外が出て動かないくらい悪いです。いうことで、Pageクラスを複数のXAPに配置しておいて、それをナビゲーションするという事は諦めたほうがよさげという結論に至ります。ついでにいうと、NavigationFrameworkにPageクラスのインスタンスの生成を任せると、MEFによるImportとかExportの範疇の外での出来事なので連携しづらいことこの上ないです。PageクラスのコンストラクタあたりでCompositionInitializer.SatisfyImports(this);するとかしないといけません。いうことで、今回考えたのはPageは静的に読み込めるクラスにしておいて、パラメータでMEFの管理するUserControlの名前渡してやって、それを表示するようにすればいいんじゃないかということです!文章だけでの説明は疲れるので、コードをのせつつ解説していきます。UserControlにつける属性ExportAttributeを拡張して、NavigateExportAttributeというものを作ります。}}こいつのメタデータをタイプセーフに読み取るためのインターフェースも作成します。}}この属性をUserControlを継承したクラスにつけることで、コントラクト名が##NaviNavi##で型がUserControlでExportされるようになります。次に、MEFのコンテナが管理するUserControlを表示するためのPageを作成します。MEFHostPageという名前で作ってみました。XAML側は、ContentControlを1つもつだけの単純なつくりです。このContentControlにUserControlをはめ込んで見た目をとっかえたりします。/></navigation:Page>コードビハインドも作成していきます。OnNavigatedToメソッドで、MEFから画面遷移する対象のUserControlを探し当てて表示しています。nameという名前のパラメータにMEFで管理されているUserControlの名前が渡ってくるという前提で作っています。}}これで、下準備完了です。適当にUserControlを作成してクラスに、NavigateExport属性とPartCreationPolicy属性をつけます。Pageというタイトルを指定する場合は以下のようになります。}}このUserControlの画面に遷移しようとした場合は、以下のようなURIをHyperlinkButtonのNavigateUriに設定すればいけます。/MEFSL.Commons;component/Navigations/MEFHostPage.xaml?name=Home毎回指定するのはだるいので、FrameのUriMapperに以下のようなマッピングを登録しておけば楽ちんです。/>UserControl内でコードから画面遷移したいんだけども・・・この方法をとると、UserControl内でコードから画面遷移するというのが、ちょっと困りものです。苦し紛れですが、以下のようなクラスを作ってお茶を濁すことが出来ます。}}このクラスを使うために、Frameを持ってる画面でExport属性をつけたFrame型のプロパティを定義する必要があります。}このプロパティが定義されているクラスもMEFで管理されてる必要があるため全体としては以下のようになります。}}INavigatorを使うUserControl側では単純にImportしてNavigateメソッドを呼ぶだけでOKです。Navigator.Navigate("/MEF/Biz1Menu");}複数のXAPに分割しつつNavigationFrameworkのメリットであるURLがページ毎に作られるという点もばっちりなので割と満足です。12:53NavigationFrameworkとMEFの連携Tweet関連記事2016-04-13UWPでSplitViewの左側のページ名のリストと右側の実際の表示されてるページを同期させるPrism使ってやってみましょう。Prismでログイン...先日書いたのをちょろっと修正しました。その11「拡張可能アプリケーショ...これまで、10回にわたってMEFについて書いてきました。C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。Blogの内容は個人の見解であり、所属する企業を代表するものではありません。)はてなブログをはじめよう!okazukiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。