2010-05-27 10 views
5

Ich habe ein kleines Werkzeug ähnlich der Windows-Systemsteuerung. Mit diesem Tool können wir Benutzer verwalten, Datenbanken konfigurieren, Skripte verwalten usw. Die Homepage zeigt alle Unterkategorien der Anwendung an. Wenn Sie auf einen Link klicken, wird die Ansicht dieser Kategorie im rechten Bereich geladen, und ein kleiner linker Bereich zeigt die für diese Kategorie verfügbaren Aufgaben an. Einfach.Prism: Ändern der aktiven Ansicht

Grundsätzlich möchte ich eine "kontextualisierte" Statusleiste haben. Wenn Sie sich in einer Ansicht befinden, in der Sie eine Verbindung herstellen müssen, sollte die Statusleiste Ihren Status anzeigen. Wenn Sie in einer Ansicht sind, in der Informationen angezeigt werden sollen, möchte ich es in meiner Statusleiste sehen.

ich bereits legte eine Region (namens StatusBarRegion für die Statusleiste in meiner Schale. Für jedes Modul registriert ich die StatusBarView dieses Moduls auf die Region Shell.

Nun möchte ich das handhaben Änderung des Kontextes. ich die gute Sicht aktivieren müssen, wenn es Zeit ist.

Aber jedes Mal wenn ich versuche, die StatusBarRegion, es kann nicht in den Regionen der Region Manager gefunden zu lösen.

See,

var region = _regionManager.Regions[.RegionNames.StatusBarRegion]; 
region.Activate(_container.Resolve<StatusBarView>()); 

Die Region ist immer null. Warum ist das ?

Danke für Ihre Zeit.

Antwort

0

Der Grund, warum die Region null war? Das Stück Code war in der Initialize Methode Modul, so dass die Benutzeroberfläche noch nicht erstellt wurde.

Für den besten Weg, um meine Statusleisten zu verwalten, frage ich mich immer noch, wie ich es tun werde.

+0

Gemäß dem PRISM-Team wird die Initialisierung des Moduls nach der Initialisierung der Shell durchgeführt. Sehen Sie hier: http://msdn.microsoft.com/en-us/library/gg430868(v=pandp.40).aspx, also Ihre Annahme, dass die Benutzeroberfläche nicht erstellt wird, glaube ich, ist falsch. –

1

Überprüfen Sie den Wert RegionNames.StatusBarRegion Wert, wenn Sie bereits dasselbe Ziel in Ihrer Shell haben.

Wenn dies der Fall ist, sollte region nicht null sein, denke ich, außer dass Sie Ihr Handle in Ihr View/ViewModel des Moduls gesetzt haben und Sie keinen Region Manager und Container auf Konstruktor bekommen haben.

Lassen Sie uns sagen, es in Ihrer Sicht behandelt SilverlightUserControl1. Der Konstruktor könnte so aussehen:

private readonly IRegionManager _regionManager; 
private readonly IUnityContainer _container; 

public SilverlightUserControl1(IRegionManager regionManager, IUnityContainer container) 
{ 
    _regionManager = regionManager; 
    _container = container; 
} 

private Button1_Click(object sender, RoutedEventArgs e) 
{ 
    var statusBarView = _container.Resolve<StatusBarView>(); 
    statusBarRegion = _regionManager.Regions["StatusBarRegion"]; 

    statusBarRegion.Add(statusBarView, "StatusBarView"); 
    statusBarRegion.Activate(statusBarView); 

    // or you could remove all views in `ActiveViews` and add the view then 
    // (no need to activate) 
} 
+0

Vielen Dank für Ihre Zeit, es wurde geschätzt. Aber wie ich bereits sagte, ist die Region null, weil der Code in der Initialize-Methode des Moduls war, daher wurde die Benutzeroberfläche noch nicht erstellt, sodass die Region nicht aufgelöst werden konnte. Dies gesagt, Ihre Antwort gibt ein gutes Beispiel für die richtige Art und Weise, Regionen zu verwenden. Danke noch einmal. – esylvestre

+0

Gibt es einen Vorteil beim Deaktivieren und Aktivieren von Ansichten über die Verwendung von 'RemoveAll()' gefolgt von dem Hinzufügen der gewünschten Ansicht? Vielen Dank. –

3

Ich glaube, Ihre Fehler zu

region.Activate(_container.Resolve<StatusBarView>()); 

und

var region = _regionManager.Regions[.RegionNames.StatusBarRegion]; 

nicht Es gibt ein paar Gründe, warum dies Ihr Problem sein könnte verwandt und ich gebe dir Lösungen, die du ausprobieren kannst.

Zunächst muss die View-Instanz in dieser Region bereits, region.Activate() vorhanden sein. Also von Ihrem Code, ich vermute, dass _container.Resolve<StatusBarView>() Ihnen eine neue Instanz des StatusBarView gibt und deshalb in dieser Region nicht existiert hat.

Lösung: Wenn Sie die StatusBarView mit dem Container registrieren, betrachten Sie eine Singleton-Ansicht.

_container.RegisterType<IStatusBarView,StatusBarView> 
    (new ContainerControlledLifetimeManager()) 

Zweitens, müssen Sie den Ansichtstyp (oder manuell hinzufügen es) in der Region registrieren, bevor Sie sie aktivieren kann.

Lösung:

_regionManager.RegisterViewWithRegion 
    (RegionNames.StatusBarRegion, typeof(IStatusBarView)); 

Alternativ:

_regionManager.Regions[RegionNames.StatusBarRegion] 
    .Add(_container.Resolve<StatusBarView>()); 
1

ich ein ähnliches Problem vor einiger Zeit hatte. Ich habe eine Frage gestellt here, aber dann herausgefunden, das Problem und seine Lösung.

Mein Problem war, dass meine Region nicht in der Shell definiert wurde. Schauen Sie sich die full question and answer here an.

Ich hoffe, das hilft.