5 Stimmen

Prisma : Ändern der aktiven Ansicht

Ich habe ein kleines Tool, das der Windows-Systemsteuerung ähnelt. Mit diesem Tool können wir Benutzer verwalten, Datenbanken konfigurieren, Skripte verwalten, usw. Auf der Startseite werden alle Unterkategorien der Anwendung angezeigt. Wenn man auf einen Link klickt, wird die Ansicht dieser Kategorie im rechten Bereich geladen und ein kleiner linker Bereich zeigt die für diese Kategorie verfügbaren Aufgaben. Einfach.

Im Grunde genommen möchte ich eine "kontextabhängige" Statusleiste haben. Wenn Sie sich in einer Ansicht befinden, in der Sie verbunden sein müssen, sollte die Statusleiste Ihren Status anzeigen. Wenn Sie sich in einer Ansicht befinden, in der Informationen angezeigt werden sollen, möchte ich diese in meiner Statusleiste haben.

Ich habe bereits eine Region (genannt StatusBarRegion für die Statusleiste in meiner Shell. Für jedes Modul habe ich die StatusBarView dieses Moduls in der Region der Shell registriert.

Jetzt möchte ich die Änderung des Kontextes behandeln. Ich muss die gute Ansicht aktivieren, wenn es soweit ist.

Aber jedes Mal, wenn ich versuche, das Problem zu lösen StatusBarRegion kann sie nicht in den Regionen des Regionsmanagers gefunden werden.

Siehe,

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

Die Region ist immer Null. Warum ist das so?

Vielen Dank für Ihre Zeit.

3voto

Tri Q Tran Punkte 5200

Ich glaube, Ihr Fehler hängt zusammen mit

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

und nicht

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

Es gibt einige Gründe, warum dies Ihr Problem sein könnte, und ich werde Ihnen Lösungen nennen, die Sie ausprobieren können.

Erstens , region.Activate() setzt voraus, dass die View-Instanz bereits in dieser Region existiert. Anhand Ihres Codes vermute ich also, dass _container.Resolve<StatusBarView>() gibt Ihnen eine neue Instanz der StatusBarView und wird daher in dieser Region nicht existiert haben.

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

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

Zweitens müssen Sie den Ansichtstyp in der Region registrieren (oder manuell hinzufügen), bevor Sie ihn aktivieren können.

Lösung:

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

Alternativ dazu:

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

1voto

Jeaf Gilbert Punkte 10595

Doppelte Kontrolle RegionNames.StatusBarRegion Wert, wenn er bereits mit Region Target in Ihrer Shell übereinstimmt.

Wenn es tut, Region sollte nicht Null sein, ich denke, außer Sie setzen Ihr Handle in Ihrem View/Viewmodel von Modul und Sie hatte nicht Region-Manager und Container auf Konstruktor erhalten.

Sagen wir, es wird aus Ihrer Sicht gehandhabt SilverlightUserControl1 . Der Konstruktor könnte folgendermaßen 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)
}

1voto

AbdouMoumen Punkte 3774

Ich hatte vor einiger Zeit ein ähnliches Problem. Ich habe eine Frage gestellt aquí aber dann fand ich das Problem und seine Lösung heraus.

Mein Problem war, dass meine Region nicht in der Shell . Überprüfen Sie die vollständige Frage und Antwort hier .

Ich hoffe, das hilft.

0voto

esylvestre Punkte 1860

Der Grund, warum die Region Null war? Das Codestück befand sich in der Initialisieren Methode der Modul Die Benutzeroberfläche wurde also noch nicht erstellt.

Ich frage mich immer noch, wie ich meine Statusleisten am besten verwalten kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X