Frage

Ich habe Schwierigkeiten ein sehr einfaches Szenario arbeitet mit PRISM 2.0 für WPF zu bekommen versuchen. Ich mag, dass der Hauptarbeitsbereich meiner Anwendung ein TabControl sein. Jedes Mal, wenn ich eine Ansicht hinzufügen, mag ich es als TabItem auf dem TabControl erscheinen.

Klingt einfach nicht wahr?

Meine Region, die in meinem Shell.XAML ist wie folgt aussieht:

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

Der Stil: ShellTabItemStyle sieht wie folgt aus:

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

Dies sollte die Header des TabItem zur HeaderInfo Eigenschaft auf der DataContext der Ansicht festgelegt. (Ich habe diese Idee von diesem Artikel ) Die DataContext meiner Ansicht ist ein sehr einfaches Presenter, die eine HeaderInfo Eigenschaft auf sich hat:

public string HeaderInfo = "The Header Text";

Meine Ansicht ist eine einfache WPF Usercontrol und sieht wie folgt aus:

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

So weit, so gut. Wenn ich den Blick auf die Region hinzufügen, erhalte ich eine Kontrolle Registerkarte und ich bekomme eine Registerkarte mit dem Text auf „Kopftext“. Mein Problem ist, dass es absolut keine Inhalte auf dem Registerkarte erscheinen. Meine Ansicht enthält eine einfache Image und TextBox, aber keiner von ihnen in der TabItem auftauchen. Wenn ich Snoop ausbrechen und sich umsehen, gibt es kein Bild in Sicht.

Was mir fehlt hier - gibt es einen einfacheren Weg,

?
War es hilfreich?

Lösung

Ich konnte nicht auf eine der vorgeschlagenen Antworten auf die Arbeit. Umfangreiche googeln half auch nicht. Ich habe das Problem einige Gedanken über das Wochenende und mehr ich darüber nachdachte, desto mehr fiel mir ein, dass es ein bisschen ein Code Geruch über diesen Ansatz. Sie injizieren einen Blick in Ihre Tab Region ... einige magischen Dinge passieren, und eine Registerkarte wird hinzugefügt ... Sie haben einige imcomprehensible dynamisch bis zu einem gewissen XAML Styling in einer Datei gespeichert irgendwo Bindung hinzuzufügen und diese können oder auch nicht Ihren Kopftext eingestellt . Wenn irgendein einzelnes Element dieser nur ein wenig falsch ist, werden Sie nicht einen Fehler, aber es wird einfach nicht funktionieren.

Aus meiner Sicht ist dies sowohl spröde (das heißt sehr leicht zu brechen) und ziemlich undurchdringlich, wenn Sie ein tiefes Verständnis PRISM haben, das Modell und von XAML. Zum Glück gibt es einen viel schöner und einfachen Weg, dies zu tun:

Erstellen Sie einfach eine Ansicht namens TabRegionView , die nur eine leere TabControl enthält. Wahrscheinlich wollen Sie diese zu Ihrem Shell.xaml hinzuzufügen. Erstellen Sie ein Event namens InjectTabView , die eine Nutzlast von Typ Usercontrol hat und abonnieren Sie dieses Ereignis in Ihrem TabRegionView Kontrolle. Wenn das Ereignis ausgelöst wird in TabRegionView erstellen Sie den TabItem manuell und den Blick auf den TabItem hinzufügen wie folgt:

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

Wenn Sie eine Ansicht als neue Registerkarte angezeigt werden soll, den Code so etwas wie folgt aussieht:

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

Diese werden bei Ihnen abgeholt von TabRegionView und der Blick wird als neuer Registerkarte hinzugefügt werden. Sie könnten den Blick in den Sielen einer Art leicht wickeln, die Header-Text enthält, ein Bild und Bool, um anzuzeigen, ob die Registerkarte automatisch ausgewählt werden soll.

IMHO hat diese Technik den doppelten Vorteil der direkte Kontrolle zu geben, was los ist, und es ist viel einfacher zu folgen.

Ich wäre sehr daran interessiert, eine Meinung zu diesem Thema von allen PRISM officianados zu erhalten.

Andere Tipps

Wenn Sie RegionManager verwenden, müssen Sie die Ansicht aktivieren. Es ist wahrscheinlich, dass einige Stück Code, wo Sie den Blick auf die Region hinzufügen, die Sie gerade benötigen zusätzlich, dass die Region zu sagen, um es zu aktivieren.

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

Es scheint, albern, aber Sie bekommen das Verhalten Sie sehen, wenn Sie dies nicht tun. Ich fand das ein bisschen frustrierend, aber es war einfach genug, um zu beheben. Das Verhalten ist noch seltsamer, wenn Sie mehrere Tabs hinzufügen, wenn Sie zumindest nicht die erste Ansicht aktivieren Sie hinzufügen.

Mein Verständnis ist, dass, wenn Sie dies nicht tun, nie der Blick Teil der visuellen Struktur wird (dies ist ein Nebeneffekt der Tatsache, dass die TabControl deaktiviert (aus der visuellen Struktur entfernt), wenn ein Tab isn‘ t „vor“. Das ist gut für bestimmte Operationen, macht aber Dinge wie diese ein wenig wackelig sein.

Einige zufälligen Gedanken:

  • versuchen, den Stil von TabControl
  • entfernen
  • überprüfen visuelle Struktur mit Hilfe von Snoop Tool. Sie sollten Ihre TabItem mit Blick Usercontrol unter dem TabControl sehen. Als nächstes können Sie überprüfen, was mit dem Usercontrol und seinen Kindern nicht stimmt (Ihrer Meinung nach Inhalt). Sie sind wahrscheinlich aus irgendeinem Grund versteckt.
  • andere Sache zu überdenken - RegionAdapter. RegionAdapters sind verantwortlich für die Regionen Ansichten Anpassung UIControl Host.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top