1

これが私のシナリオです:

  1. 1 つの TabControl と MenuRegion という 1 つの領域を持つシェル
  2. MenuRegion には、使用可能な各モジュール (アプリケーション) のボタンが含まれています。

Prism (WPF 用の複合アプリケーション ライブラリ) を使用して次のことを実現したいと考えています。 . 1 つのモジュールが TabControl に複数回表示される場合があります。


あなたの答えに本当に感謝します。しかし、あなたが Prism ( http://www.codeplex.com/CompositeWPF ) を使用しているとは思いませんか? 私の質問はプリズムに関連していたので、より明確にするために編集しました。

Prism では、モジュールのビューをリージョンに動的にロードします。地域は動的に設定されるため、私のシナリオでそれを行う方法がわかりません。どのように名前を付けますか?

ありがとう!

4

3 に答える 3

1

私はこの PRISM の世界に不慣れで (1 週間の経験:)))、同じ要件がありました! まず、ここから Regionextensions を取得する必要があります。

私(あなたかもしれません)の問題の解決策は次のとおりです。

  • 2つの領域があります(メニューとタブコントロール - mdiのような動作用)

  • tabitem ヘッダーには、閉じるためのボタンを用意する必要があります (これは、この tabitem を閉じるためのコマンドにバインドされています。実際には、この tabitem を非表示にします)

  • ビューをロードする必要があるモジュールにメニュー項目からイベントを送信します(オンデマンドでモジュールをインスタンス化しました)。モジュールの初期化メソッドで、メニュー項目によって送信されたイベントをサブスクライブします。イベント処理メソッドでは、タブアイテムを再表示するだけです

これが抽象的である場合は、私が開発したスケルトン アプリケーションをお送りします。

于 2009-10-08T19:52:10.580 に答える
0

応答がかなり遅いことはわかっていますが、まだ完全な解決策には達していませんが、同様のことを行っています。

このコードは、プレゼンターで処理しているボタンのクリック イベントで発生します。モジュールは構成ファイルで定義されます。

ModuleInfo moduleInfoObject = this.moduleEnumerator.GetModule("ModuleA"); 

Assembly assembly = this.LoadAssembly(moduleInfoObject);

Type type = assembly.GetType(moduleInfoObject.ModuleType);
IModule aModule = this.CreateModule(type);                                    
aModule.Initialize();  


// - - - -Helper Methods - - - -
// - - - LoadAssembly - - -       
private Assembly LoadAssembly(ModuleInfo moduleInfo)
    {            
        string assemblyFile = moduleInfo.AssemblyFile;
        assemblyFile = this.GetModulePath(assemblyFile);

        FileInfo file = new FileInfo(assemblyFile);
        Assembly assembly;

        try
        {
            assembly = Assembly.LoadFrom(file.FullName);
        } 
        catch (Exception ex)
        {
            throw new ModuleLoadException(null, assemblyFile, ex.Message, ex);
        } 

        return assembly;

    } // LoadAssembly(moduleInfo)


// - - - CreateModule - - -
private IModule CreateModule(Type type)
    {
        return (IModule)containerFacade.Resolve(type);            
    } // CreateModule(type)


// - - - GetModulePath - - -
private string GetModulePath(string assemblyFile)
    {
        if (String.IsNullOrEmpty(assemblyFile))
        {
            throw new ArgumentNullException("assemblyFile");
        } // if

        if (Path.IsPathRooted(assemblyFile) == false)
        {
            assemblyFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, assemblyFile);
        } // if

        return assemblyFile;
    } // GetModulePath(assemblyFile)
于 2009-06-17T14:29:17.700 に答える
0

同様のことを行いますが、タブ項目は既に (コンテンツなしで) 作成されており、必要に応じて表示/非表示を切り替えます。タブ項目が選択されると、タブのコンテンツが読み込まれます。

private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (e.OriginalSource != sender) return;

        TabControl tabControl = (TabControl)sender;
        TabItem tabItem = (TabItem)tabControl.SelectedItem;

        if (!tabItem.HasContent)
            AddTabContent(tabItem); // This will cause a refresh once the content is loaded.
        else
            Refresh(tabItem);
    }



private void AddTabContent(TabItem tabItem)
    {
        IOptimusPage page = tabItem.Tag as IOptimusPage;

        //This allows lazy loading of controls
        if (page != null)
        {
            if (!tabItem.HasContent)
            {
                CustomerEngagementUserControl control = page.GetControl(DataContext as CustomerEngagementUIObject, Services);

                tabItem.Content = control;
            }
        }

    }

タブ項目のコンテンツは、コンテンツの作成を担当するページを使用して、タブ項目タグで指定されます。

<TabItem
Header="Personal Background"
Style="{StaticResource FirstBreadcrumbTabItem}"
x:Name="PersonalBackgroundTab">
    <TabItem.Tag>
        <Pages:FfnaPersonalBackgroundPage />
    </TabItem.Tag>
</TabItem>

ページがコントロールを作成します。

class FfnaPersonalBackgroundPage : IOptimusPage
{
    #region IOptimusPage Members

    public CustomerEngagementUserControl GetControl(CustomerEngagementUIObject dataContext, CustomerEngagementServices services)
    {
        CustomerEngagementUserControl control = new FfnaPersonalBackgroundControl();
        control.DataContext = dataContext;
        control.Services = services;
        return control;
    }

    #endregion
}

同様の手法を使用して、その場でタブ項目を作成できます。

于 2009-01-16T20:53:16.553 に答える