4

WPF用のPRISM2.0で動作する非常に単純なシナリオを取得しようとすると問題が発生します。アプリケーションのメインワークエリアをにしたいと思いますTabControl。ビューを追加するたびに、にとして表示されるようTabItemにしTabControlます。

簡単そうですね。

Shell.XAMLにある私のリージョンは次のようになります。

<Controls:TabControl 
    Name="MainRegion" 
    cal:RegionManager.RegionName="{x:Static Infrastructure:RegionNames.TabRegion}"
    ItemContainerStyle="{StaticResource ShellTabItemStyle}" />

スタイル:ShellTabItemStyle次のようになります:

<Style x:Key="ShellTabItemStyle" TargetType="{x:Type TabItem}">
    <Setter Property="Header" Value="{Binding Content.DataContext.HeaderInfo, RelativeSource={RelativeSource Self}}" />
</Style>

これにより、のがビューののプロパティに設定HeaderTabItemHeaderInfoますDataContext(私はこの記事からこのアイデアを得ました)DataContext私の見解は非常に単純Presenterで、HeaderInfoプロパティがあります:

public string HeaderInfo = "The Header Text";

私のビューは単純なWPFユーザーコントロールであり、次のようになります。

  <StackPanel>
    <TextBox Text="Hello World" Name="MyTextBox"></TextBox>
    <Image Source="..SomeImage.PNG" Name="MyImage"></Image>
  </StackPanel>

ここまでは順調ですね。領域にビューを追加すると、タブコントロールが表示され、テキストが「ヘッダーテキスト」に設定されたタブが表示されます。私の問題は、タブにコンテンツがまったく表示されないことです。私のビューには単純なものImageとが含まれていますTextBoxが、どちらもに表示されませんTabItem。スヌープを破って周りを見回すと、画像が見えません。

ここで何が欠けていますか?もっと簡単な方法はありますか?

4

3 に答える 3

3

提案された回答を機能させることができませんでした。大規模なグーグルも役に立ちませんでした。私は週末にこの問題について少し考えてみましたが、さらに考えてみると、このアプローチにはコードの匂いが少しあることに気づきました。ビューをタブ領域に挿入します...いくつかの魔法のようなことが起こり、タブが追加されます...ファイルに保存されているXAMLスタイルに理解できない動的バインディングを追加する必要があり、これによりヘッダーテキストが設定される場合と設定されない場合があります. この要素の 1 つでも少しでも間違っていれば、エラーにはなりませんが、機能しません。

私の見解では、これは脆弱 (つまり、非常に壊れやすい) であり、PRISM、モデル、および XAML を深く理解していない限り、非常に難解です。幸いなことに、これを行うためのはるかに優れた簡単な方法があります。

空白の TabControl のみを含むTabRegionViewというビューを作成するだけです。これを Shell.xaml に追加することをお勧めします。タイプ UserControl のペイロードを持つInjectTabViewというイベントを作成し、 TabRegionViewコントロールでこのイベントをサブスクライブします。TabRegionViewでイベントが発生すると、TabItem を手動で作成し、次のようにビューを TabItem に追加します。

public void TabAdded(UserControl view)
{
    var item = new TabItem();
    item.Content = view;
    item.IsSelected = true;
    item.Header = "Header Text";
    mainTab.Items.Add(item);
}

ビューを新しいタブとして表示する場合、コードは次のようになります。

    var view = new View(params);
    _eventAggregator.GetEvent<InjectTabViewEvent>()
        .Publish(view);

これはTabRegionViewによって取得され、ビューが新しいタブとして追加されます。ヘッダー テキスト、イメージ、およびタブを自動選択するかどうかを示す bool を含む何らかのタイプのハーネスで View を簡単にラップできます。

IMHO この手法には、何が起こっているかを直接制御できるという 2 つの利点があります。

これについて、PRISM 関係者から意見を求めたいと思います。

于 2009-10-26T12:15:27.777 に答える
2

RegionManager を使用している場合は、ビューをアクティブ化する必要があります。ビューをリージョンに追加するコードがいくつかある可能性があります。さらに、そのリージョンにそれをアクティブにするように指示する必要があります。

public void AddViewToRegion(IRegion region, object view)
{
     region.Add(view);
     region.Activate(view);
}

ばかげているように見えますが、これを行わないと、見ている動作が得られます。これはちょっとイライラしましたが、修正するのは簡単でした。複数のタブを追加すると、少なくとも追加する最初のビューをアクティブ化しないと、動作がさらに奇妙になります。

私の理解では、これを行わないと、ビューがビジュアル ツリーの一部になることはありません (これは、タブが「イン」されていないときに TabControl が非アクティブ化される (ビジュアル ツリーから削除される) という事実の副作用です)。これは特定の操作には適していますが、このような操作は少し不安定になります。

于 2009-10-23T17:34:32.520 に答える
0

いくつかのランダムな考え:

  • TabControlからスタイルを削除してみてください
  • スヌープツールを使用してビジュアルツリーを確認します。TabControlの下にビューのUserControlを含むTabItemが表示されます。次に、そのUserControlとその子(ビューのコンテンツ)の何が問題になっているのかを確認できます。それらはおそらく何らかの理由で隠されています。
  • 考えるべき他のこと-RegionAdapter。RegionAdaptersは、リージョンのビューをホストUIControlに適合させる役割を果たします。
于 2010-09-13T17:17:51.943 に答える