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?
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
@ 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
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. –