Es gibt zwei Möglichkeiten, wie ich denke, kann dies
Die erste leicht zu tun würde eine Popup
statt eines neuen Window
zu bedienen. Zum Beispiel setze ich oft Eigenschaften in meine ViewModel
für PopupContent
und IsPopupVisible
, und setze diese Werte immer, wenn ich meine Popup
Steuerung anzeigen möchte. Zum Beispiel kann ein ShowAboutPopup
Relais Befehl könnte wie folgt auszuführen:
void ShowAboutPopup()
{
PopupContent = new AboutViewModel();
IsPopupVisible = true;
}
Sie es anzeigen kann ein Popup
Objekt verwenden oder eine benutzerdefinierte UserControl
. Ich ziehe meine eigenen custom Popup UserControl, die in der Regel wie folgt aussehen wird am Ende zu verwenden:
<Window>
<Canvas x:Name="RootPanel">
<SomePanel>
<!-- Regular content goes here -->
</SomePanel>
<local:PopupPanel Content="{Binding PopupContent}"
local:PopupPanel.IsPopupVisible="{Binding IsPopupVisible}"
local:PopupPanel.PopupParent="{Binding ElementName=RootPanel}" />
</Canvas>
</Window>
Die PopupContent
Eigenschaft ist ein ViewModel
(wie ein AboutViewModel
) und DataTemplates
verwendet WPF zu sagen, bestimmte ViewModels
mit spezifischen zu zeichnen Views
<Window.Resources>
<DataTemplate DataType="{x:Type local:AboutViewModel}">
<local:AboutView />
</DataTemplate>
</Window.Resources>
Das andere Verfahren ist eine Art von ApplicationViewModel
, die beim Start ausgeführt haben, und ist für den gesamten Anwendungszustand verantwortlich, die das Fenster umfasst (en) ist geöffnet.
Normalerweise ziehe ich ein einziges ApplicationView
zu haben, die ein ContentControl
enthält die aktuelle Seite
<Window>
<ContentControl Content="{Binding CurrentViewModel}" />
</Window>
jedoch auch mehrere Fenster verwalten verwendet werden kann, angezeigt werden soll. Wenn Sie es verwenden, um mehrere Window
Objekte zu verwalten, sollten Sie darauf hingewiesen werden, dass dies kein reines ViewModel
ist, da es auf einige View-spezifische Objekte zugreifen muss und UI-Objekte referenziert, was nicht eine Aufgabe von ViewModel
sein sollte. Zum Beispiel kann es abonnieren, um ShowWindow
Nachrichten zu empfangen, und beim Empfang dieser Nachrichten würde es die angegebene Ansicht erstellen und anzeigen und möglicherweise auch das aktuelle Fenster ausblenden.
Persönlich versuche ich, mehrere Fenster so viel wie möglich zu vermeiden. Meine übliche Methode ist eine einzige View, die konsistente Anwendungsobjekte für jede Seite enthält, und eine ContentControl
, die dynamischen Inhalt enthält, der sich ändert. Ich habe eine example using this navigation style on my blog wenn Sie interessiert sind
Einige Ihrer Code wäre super hilfreich, um eine Antwort zu finden ... – EtherDragon