Hay dos maneras que se me ocurre que hacer esto fácilmente
La primera sería la de utilizar un Popup
en lugar de un nuevo Window
. Por ejemplo, a menudo pongo propiedades en mi ViewModel
para PopupContent
y IsPopupVisible
, y establezco esos valores en cualquier momento que deseo mostrar mi control Popup
. Por ejemplo, un comando ShowAboutPopup
relé podría ejecutar algo como esto:
void ShowAboutPopup()
{
PopupContent = new AboutViewModel();
IsPopupVisible = true;
}
para poder visualizarlo con un objeto Popup
, o una costumbre UserControl
. Yo prefiero usar mi propia custom Popup UserControl, que por lo general terminan con este aspecto:
<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>
La propiedad PopupContent
es una ViewModel
(como un AboutViewModel
), y DataTemplates
se utiliza contar WPF para dibujar específica ViewModels
con específica Views
<Window.Resources>
<DataTemplate DataType="{x:Type local:AboutViewModel}">
<local:AboutView />
</DataTemplate>
</Window.Resources>
el otro método es tener algún tipo de ApplicationViewModel
que se ejecuta en el arranque, y es responsable del estado de aplicación general, que incluye el cual la ventana (s) están abiertas.
Normalmente prefiero tener un solo ApplicationView
que contiene una ContentControl
para mostrar la página actual
<Window>
<ContentControl Content="{Binding CurrentViewModel}" />
</Window>
sin embargo, también se puede utilizar para gestionar varias ventanas. Si lo usa para administrar varios objetos Window
, tenga en cuenta que esto no será puro ViewModel
, ya que necesitará acceder a algunos objetos específicos de la vista, y al hacer referencia a objetos UI, no es algo que ViewModel
debería hacer. Por ejemplo, puede suscribirse para recibir mensajes ShowWindow
, y al recibir esos mensajes crearía la Vista especificada y la mostraría, y posiblemente también ocultaría la ventana actual.
Personalmente, trato de evitar varias ventanas tanto como sea posible. Mi método habitual es tener una sola Vista que contenga objetos de aplicación coherentes para cualquier página, y un ContentControl
que contenga contenido dinámico que cambie. Tengo un example using this navigation style on my blog si te interesa
Parte de tu código sería muy útil para encontrar una respuesta ... – EtherDragon