2012-03-03 21 views
7

私はWPFアプリケーションにTabControlを持っています。私は、私のアプリケーションが単一のプログラム内の複数の「インスタンス」を基本的にサポートするようにしたい。たとえば、Webブラウザについて考えてみると、異なるタブで複数のWebサイトインスタンスを持つことができます。アプリケーションに複数のサブアプリケーションが含まれている同様の機能を実現したいと考えています。WPF/C#でタブ可能なコンテンツを作成する方法は?

私は現在直面している問題は、各タブはまったく同じマークアップとUIが、異なるデータを持っているので、私は、すべてのタブに同じXAMLをコピー&ペーストしなければならないということです。別の問題は、それらのタブを動的に作成する機能が必要なことです。

私のアプリケーションの現在の状態のスクリーンショットです。ご覧のとおり、上部に2つのタブがあり、2つ目のタブは非アクティブなので透明な背景があります。

enter image description here

だから、どのように私はすべてのタブのタブのUIが同じままタブ可能なシステムを作成しないと私は唯一のXAML UIを開発、各タブのためにそれを複製する必要がありますか?

要件:

  • すべてのタブが同じUIを持っています。
  • すべてのタブにはUI要素のデータが異なります。
  • 開発者は、Visual Studio内でタブのXAMLを一度だけ操作したいと思っています。

理想的には、1つのスタイルのないタブコントロールがあり、起動時のアプリケーションがすべて同じUIを持ちながら異なるデータを持つ2-nタブを動的に作成するのが好きです。

答えて

3

が、おそらくこれを行うための方法はたくさんありますが、ここで私の簡単な方法です:

がそれぞれ自分の同じタブの内容を定義するDataTemplateを定義します。データテンプレートのコントロールは、現在選択されているタブのビューモデルにバインドされます。私は私の例では単一のTextBlockを配置しましたが、簡単にこれを拡張することができます。

<Page.DataContext> 
    <Samples:TabBindingViewModels /> 
</Page.DataContext> 

<Grid> 
    <Grid.Resources> 
     <DataTemplate x:Key="ContentTemplate" 
         DataType="{x:Type Samples:TabBindingViewModel}"> 
      <TextBlock Text="{Binding Content}"/> 
     </DataTemplate> 
    </Grid.Resources> 
    <TabControl ContentTemplate="{StaticResource ContentTemplate}" 
       DisplayMemberPath="Header" ItemsSource="{Binding Items}" /> 
</Grid> 

と、このビューモデルコード:

public class TabBindingViewModels 
{ 
    public TabBindingViewModels() 
    { 
     Items = new ObservableCollection<TabBindingViewModel> 
        { 
         new TabBindingViewModel(1), 
         new TabBindingViewModel(2), 
         new TabBindingViewModel(3), 
        }; 
    } 

    public IEnumerable<TabBindingViewModel> Items { get; private set; } 
} 

public class TabBindingViewModel 
{ 
    public TabBindingViewModel() : this(0) 
    { 
    } 

    public TabBindingViewModel(int n) 
    { 
     Header = "I'm the header: " + n.ToString(CultureInfo.InvariantCulture); 
     Content = "I'm the content: " + n.ToString(CultureInfo.InvariantCulture); 
    } 

    public string Header { get; set; } 
    public string Content { get; set; } 
} 

を我々が得る:タブコントロールのスタイリングに

enter image description here

私はかなりこのようなtutorialこのXAMLを使用して

。より複雑なコンテンツをタブヘッダーやコンテンツに簡単に入れることができます。

タブコントロールのテンプレート全体を調べて、タブコントロールの仕組みを理解する必要があります。 BlendまたはVS11 betaを使用してテンプレートを抽出します。

タブを動的に追加/削除するには、ビューモデルのObservableCollectionに項目を追加/削除するだけです。

2

これは、あなたが取ることができる多くの異なるパスがあるため、実際にはかなり大きな回答に変わる可能性があります。

TabControlはItemsControlです。つまり、各モジュールを構成するUserControlsなどのオブジェクトのコレクションを含めることができます。このように、PrismのIModuleのようなインターフェイスを実装するいくつかのモジュールプロジェクトの内部にあるUserControlオブジェクトのObservableCollection{T}にItemsプロパティをバインドすることから始められます。インターフェイスは、タブ内にロードできるモジュールの開始点を定義します。モジュールが要求されると、単にアセンブリをロードし、モジュールに定義された領域への参照を含むタブを追加するだけです。

それは実際には非常に難しいことではありませんが、私はそれがあなたのために重い物を持ち上げるの多くを処理しますので、あなたがPrismをよく読んでお勧めします。私は最近、Prismを使用して記述したのとまったく同じインターフェースを構築しました。

+0

興味深いことに、私はプリズムについても知らなかった。 – Tower

+0

いくつかサンプルデモアプリケーションがありますか? – Tower

+1

残念ながら、私にはわからないし、私のアプリケーションはオープンソースではありません。ここのクイックスタートガイドは、始めるのに役立つかもしれません。立ち往生した場合は、新しい質問をしてください。 ;-)あなたが一度それに入ると、それはあまりにも難しくないことを約束します。あなたの過去の専門知識を持つhttp://msdn.microsoft.com/en-us/library/ff921153(v=pandp.sec).aspx#sec15 – senfo

1

MVVMフレームワークベースのソリューションのためのCaliburn.Microを見てみましょう。求めている正確な質問は、サンプルソリューションの1つで解決されます。

http://caliburnmicro.codeplex.com/

+0

いくつかの要件がありますか?私はVS 2011でサンプルの多くを開こうとしましたが、大部分はアセンブリの不足について不平を言いました。私はSilverlight binフォルダから見つけたものを手動で追加することでそれらのいくつかを修正しました。 'プロパティ 'Dock'は、XML名前空間 'clr-namespace:System.Windows.Controls; assembly = System.Windows.Controls.Toolkit'の 'StackPanel'型には存在しません。どのサンプルが私の質問に正確に答えるか覚えていますか?その特定のサンプルを修正しようとしています:) – Tower

+0

@rFactor、サンプルの名前はCaliburn.Micro.SimpleMDIでした。サンプルリストのSilverlight以外の数少ないプロジェクトの1つです。私はまだVS 2010を持っており、ロードして正常に動作します。 – code4life

+0

解凍する前にzipファイルのブロックを解除していないと思います。 zipを右クリックし、プロパティを選択します。 「ブロック解除」ボタンを押してください。今すぐ解凍してください。おそらく、物事はずっと良くなっています。 – Phil

1

は、より多くの情報がなければ、私のアプローチは、各インスタンスまたはタブのためのApplicationDomainの内部MVVMプロバイダを起動することです。タブを終了/閉じるときに、アプリドメインをアンロードします。別の答えで述べたように

関連する問題