19

Prism 4 のナビゲーション機能を学習するデモ アプリを作成しています。アプリには 2 つのモジュールがあり、それぞれに 3 つのビューがあります。

  • テキスト ブロックを含む UserControl (「モジュール A へようこそ」)
  • RibbonTab (Region Adapter を使用)、および
  • Outlook スタイルのタスク ボタン (Outlook のメール、カレンダーなど)

シェルには、"RibbonRegion"、"TaskButtonRegion"、および "WorkspaceRegion" の 3 つの名前付き領域があります。ビューはこれらのリージョンにロードされます。基本的なセットアップをテストするために、3 つのビューすべてを Prism Region Manager に登録して、起動時に読み込まれるようにし、すべてが期待どおりに機能するようにしました。

次に、起動時にタスク ボタンのみが読み込まれるように設定を変更しました。他のビューは、タスク ボタンをクリックすることによって、要求があった場合にのみロードされます。私のモジュール初期化子は次のようになります。

public void Initialize()
{
    /* We register the Task Button with the Prism Task Button Region because we want it
     * to be displayed immediately when the module is loaded, and for the lifetime of
     * the application. */

    // Register Task Button with Prism Region
    m_RegionManager.RegisterViewWithRegion("TaskButtonRegion", typeof(ModuleATaskButton));

    /* We register these objects with the Unity container because we don't want them
     * instantiated until we navigate to this module. */ 

    // Register View and Ribbon Tab as singletons with Unity container
    m_Container.RegisterType(typeof(ModuleAView), "ModuleAView", new ContainerControlledLifetimeManager());
    m_Container.RegisterType(typeof(ModuleARibbonTab), "ModuleARibbonTab", new ContainerControlledLifetimeManager());
}

IRegionManager.RequestNavigate()ユーザーがタスク ボタンをクリックすると、ビューを表示するために呼び出す ICommand オブジェクトが呼び出されます。

public void Execute(object parameter)
{
    // Initialize
    var regionManager = m_ViewModel.RegionManager;

    // Show Ribbon Tab
    var moduleARibbonTab = new Uri("ModuleARibbonTab", UriKind.Relative);
    regionManager.RequestNavigate("RibbonRegion", moduleARibbonTab);

    // Show View
    var moduleAView = new Uri("ModuleAView", UriKind.Relative);
    regionManager.RequestNavigate("WorkspaceRegion", moduleAView);
}

タスクボタンがクリックされるとコマンドが呼び出されますが、得られるのは次のとおりです。

デモアプリのスクリーンショット

UserControl は明らかに としてロードされておりSystem.Object、RibbonTab も同じものをロードしていると思われます。問題は私のRequestNavigate()通話、または Unity への登録にあると思います。しかし、私は問題を特定できません。

何が起こっているのか、誰かが光を当てることができますか? ご協力いただきありがとうございます。

4

1 に答える 1

28

最後にこれを理解しました。答えは、Microsoft Prism の開発者ガイド(Ver 4) の 120 ~ 121 ページにあります。次の 2 つの部分があります。

まず、UserControlRibbonTabオブジェクトが Unity からSystem.Object型として解決されていました。これは、Unity と、ビュー オブジェクトの登録に使用したオーバーロードの制限です。それらを正しい型に解決するには、別のオーバーロードを使用する必要がありますIUnityContainer.RegisterType()

// Register other view objects with DI Container (Unity)
m_Container.RegisterType<Object, ModuleAView>("ModuleAView");
m_Container.RegisterType<Object, ModuleARibbonTab>("ModuleARibbonTab");

このオーバーロードは、Unity のネイティブSystem.Object解像度を、要求されたビューの正しいタイプにマップします。の注を参照してください。デベロッパー ガイドの120 を参照してください。

2 番目の問題は私の質問では明示的に述べられていませんでしたが、最初の問題を修正したときに発生しました。RibbonTab他のモジュールに切り替えたときに、各モジュールを削除したかったのです。リボン領域は のように動作するためItemsControl、両方が表示されてしまいました。モジュール B に切り替えたときに、RibbonTabsモジュール Aはアンロードされませんでした。その問題を解決するために、クラスに実装しました。その問題はpでカバーされています。開発者ガイドの121 。RibbonTabIRegionMemberLifetimeRibbonTab

ところで、IRegionMemberLifetimeインターフェースはアプリのバックエンドには影響せず、ビュー オブジェクトのみに影響するため、ビュー モデルではなくビュー オブジェクトにインターフェースを実装しました。

于 2011-03-01T00:17:47.627 に答える