2017-04-09 3 views
0

Ich habe Dialog-Fenster mit einer TabControl, die 4 Registerkarten enthält, jede Registerkarte enthält eine Region.WPF - Prism: Zeige Regionen im Dialogfenster

DialogWindowTestView.xaml

<TabControl DockPanel.Dock="Top" TabStripPlacement="Left"> 
    <TabItem Header="General"> 
     <ContentControl regions:RegionManager.RegionName="GeneralRegion" /> 
    </TabItem> 
    <TabItem Header="Materials"> 
     <ContentControl regions:RegionManager.RegionName="MaterialsRegion" /> 
    </TabItem> 
    <TabItem Header="Design"> 
     <ContentControl regions:RegionManager.RegionName="DesignRegion" /> 
    </TabItem> 
    <TabItem Header="Units"> 
     <ContentControl regions:RegionManager.RegionName="UnitsRegion" /> 
    </TabItem> 
</TabControl> 

I zwei Methoden, um die versucht haben, im Inneren der Laschen die Bereiche anzuzeigen. Zuerst habe ich RegisterViewWithRegion verwendet. Dies zeigt die Regionen korrekt an, , aber die Ansicht wird einmal beim ersten Öffnen des Dialogfensters aufgerufen, und nach Schließen des Fensters und erneutem Öffnen wird der Ansichtskonstruktor jedes Mal, wenn der Benutzer das Dialogfenster öffnet, mehrfach aufgerufen.

Edit: Es ist die Ansicht innerhalb der TabItem, die oft aufgerufen wird, nicht das Dialogfeld.

DialogWindowTestViewModel.cs

if (!regionManager.Regions.ContainsRegionWithName("GeneralRegion")) { 
    regionManager.RegisterViewWithRegion("GeneralRegion", typeof(GeneralView)); 
} 
if (!regionManager.Regions.ContainsRegionWithName("MaterialsRegion")) { 
    regionManager.RegisterViewWithRegion("MaterialsRegion", typeof(MaterialsView)); 
} 
if (!regionManager.Regions.ContainsRegionWithName("DesignRegion")) { 
    regionManager.RegisterViewWithRegion("DesignRegion", typeof(DesignView)); 
} 
if (!regionManager.Regions.ContainsRegionWithName("UnitsRegion")) { 
    regionManager.RegisterViewWithRegion("UnitsRegion", typeof(UnitSetView)); 
} 

Die zweite Methode regionManager.RequestNavigate ist, zeigt dies die Bereiche korrekt, aber nach dem Schließen und Wieder Meinen der Ansicht alle Regionen verschwinden. Das Fenster wird mit allen Registerkarten leer sein.

DialogWindowTestView.xaml.cs

RegionManager.SetRegionManager(this, regionManager); 
RegionManager.UpdateRegions(); 

DialogWindowTestViewModel.cs

container.RegisterType<object, GeneralView>(typeof(GeneralView).FullName); 
regionManager.RequestNavigate("GeneralRegion", typeof(GeneralView).FullName); 

container.RegisterType<object, MaterialsView>(typeof(MaterialsView).FullName); 
regionManager.RequestNavigate("MaterialsRegion", typeof(MaterialsView).FullName); 

container.RegisterType<object, DesignView>(typeof(DesignView).FullName); 
regionManager.RequestNavigate("DesignRegion", typeof(DesignView).FullName); 

container.RegisterType<object, UnitSetView>(typeof(UnitSetView).FullName); 
regionManager.RequestNavigate("UnitsRegion", typeof(UnitSetView).FullName); 

Was ist der beste Weg, um die Regionen korrekt ohne unerwünschte Verhaltensweisen zu zeigen?

+0

Was ist los mit dem ersten Ansatz? Erwarten Sie, dass die Ansichten nicht neu erstellt werden, wenn das Dialogfeld geschlossen und erneut geöffnet wird? – mm8

+0

@ mm8 Der View-Konstruktor wird jedes Mal mehrfach aufgerufen, wenn der Benutzer die Ansicht öffnet, und die Anzahl der Aufrufe des Konstruktors wird jedes Mal erhöht, wenn das Fenster geschlossen und wieder geöffnet wird. Wenn der View-Konstruktor zum ersten Mal beim Erstellen der Ansicht aufgerufen wird, wird er zum zweiten Mal dreimal aufgerufen. Das dritte Mal wird noch mehr aufgerufen. ** Es ist die Ansicht innerhalb des TabItems, die oft aufgerufen wird, nicht das Dialogfenster. ** – IBRA

+0

In den Ansichten oder Ansicht Modelle im Dialogfeld, abonnieren Sie Ereignisse oder Registrierung von Anwendungsbefehlen, die Sie nicht abmelden oder die Registrierung aufheben, wenn der Dialog geschlossen wird? Das kann ähnliches Verhalten verursachen. –

Antwort

1

Ihr erster Ansatz: RegisterViewWithRegion ist eine globale Registrierung, die für die Lebensdauer der Anwendung leben wird. Um die Registrierung durchzuführen, müssen Sie nicht nach dem Vorhandensein der Region suchen. Sie sollten sich nicht mehrmals registrieren, was zu einem beobachteten Verhalten führt.

Verschieben Sie die Registrierung aus dem Ansichtskonstruktor, sodass sie nur einmal erstellt werden.

Entfernen Sie die Prüfung auf Vorhandensein der Region.

Ihre Überprüfung auf Vorhandensein einer Region schlägt fehl und Registrierungen werden mehrmals ausgeführt, da die Ansicht beim Schließen der Ansicht aus der visuellen Struktur entfernt wird und ein spezielles Regionsverhalten die Regionen aus dem Regionsmanager entfernt.

Verwandte Themen