Básicamente, cuando el usuario cambia el tamaño de la ventana de mi aplicación, quiero que la aplicación tenga el mismo tamaño cuando la aplicación se vuelva a abrir.
Al principio pensé en manejar el evento SizeChanged y guardar Height y Width, pero creo que debe haber una solución más fácil.
Problema bastante simple, pero no puedo encontrar una solución fácil.
Respuestas:
Guarde los valores en el archivo user.config.
Deberá crear el valor en el archivo de configuración; debe estar en la carpeta Propiedades. Crea cinco valores:
Top
de tipodouble
Left
de tipodouble
Height
de tipodouble
Width
de tipodouble
Maximized
de tipobool
: para mantener si la ventana está maximizada o no. Si desea almacenar más información, se necesitará un tipo o estructura diferente.Inicialice los dos primeros en 0 y los dos segundos en el tamaño predeterminado de su aplicación, y el último en falso.
Cree un controlador de eventos Window_OnSourceInitialized y agregue lo siguiente:
NOTA: La ubicación de la ventana configurada debe ir en el evento inicializado en la fuente de la ventana, no en el constructor; de lo contrario, si tiene la ventana maximizada en un segundo monitor, siempre se reiniciará maximizada en el monitor principal y no podrá para acceder a él.
Cree un controlador de eventos Window_Closing y agregue lo siguiente:
Esto fallará si el usuario reduce el área de visualización, ya sea desconectando una pantalla o cambiando la resolución de la pantalla, mientras la aplicación está cerrada, por lo que debe agregar una verificación de que la ubicación y el tamaño deseados siguen siendo válidos antes de aplicar los valores.
fuente
En realidad, no necesita usar código subyacente para hacer eso (excepto para guardar la configuración). Puede usar una extensión de marcado personalizada para vincular el tamaño y la posición de la ventana a la configuración de esta manera:
Puede encontrar el código para esta extensión de marcado aquí: http://www.thomaslevesque.com/2008/11/18/wpf-binding-to-application-settings-using-a-markup-extension/
fuente
{Binding Settings.Height}
, etc.Si bien puede "rodar por su cuenta" y guardar manualmente la configuración en algún lugar, y en general funcionará, es muy fácil no manejar todos los casos correctamente. Es mucho mejor dejar que el sistema operativo haga el trabajo por usted, llamando a GetWindowPlacement () al salir y SetWindowPlacement () al inicio. Maneja todos los casos extremos locos que pueden ocurrir (múltiples monitores, guardar el tamaño normal de la ventana si está cerrada mientras está maximizada, etc.) para que usted no tenga que hacerlo.
Este ejemplo de MSDN muestra cómo usarlos con una aplicación WPF. La muestra no es perfecta (la ventana comenzará en la esquina superior izquierda lo más pequeña posible en la primera ejecución, y hay un comportamiento extraño con el diseñador de Configuración guardando un valor de tipo
WINDOWPLACEMENT
), pero al menos debería ayudarlo a comenzar.fuente
El enlace de "forma larga" que Thomas publicó anteriormente casi no requiere codificación, solo asegúrese de tener el enlace del espacio de nombres:
Luego, para guardar en el código subyacente:
fuente
WindowState="{Binding Source={x:Static properties:Settings.Default}, Path=WindowState, Mode=TwoWay}"
Alternativamente, también le puede gustar el siguiente enfoque ( ver fuente ). Agregue la clase WindowSettings a su proyecto e insértela
WindowSettings.Save="True"
en el encabezado de la ventana principal:Donde WindowSettings se define de la siguiente manera:
fuente
La forma predeterminada de resolverlo es usar archivos de configuración. El problema con los archivos de configuración es que debe definir todas las configuraciones y escribir el código que copia los datos de un lado a otro. Bastante tedioso si tiene muchas propiedades de las que realizar un seguimiento.
Hice una biblioteca bastante flexible y muy fácil de usar para esto, solo dígale qué propiedades de qué objeto rastrear y él hace el resto. También puede configurar la mierda si lo desea.
La biblioteca se llama Jot (github) , aquí hay un artículo antiguo de CodeProject que escribí al respecto.
Así es como lo usaría para realizar un seguimiento del tamaño y la ubicación de una ventana:
Archivos Jot frente a archivos de configuración: con Jot hay considerablemente menos código y es mucho menos propenso a errores, ya que solo necesita mencionar cada propiedad una vez . Con los archivos de configuración, debe mencionar cada propiedad 5 veces : una cuando crea explícitamente la propiedad y cuatro veces adicionales en el código que copia los valores de un lado a otro.
El almacenamiento, la serialización, etc. son completamente configurables. Además, al usar IOC, incluso puede conectarlo para que aplique el seguimiento automáticamente a todos los objetos que resuelve, de modo que todo lo que necesita hacer para que una propiedad sea persistente es colocar un atributo [Trackable] en ella.
Estoy escribiendo todo esto porque creo que la biblioteca es de primera categoría y quiero hablar sobre ello.
fuente
Escribí una clase rápida que hace esto. Así es como se llama:
Y aquí está el código:
fuente
Hay una vista de RestoreWindowPlace del proyecto NuGet en github que hace todo esto por usted, guardando la información en un archivo XML.
Para que funcione en una ventana, es tan simple como llamar:
((App)Application.Current).WindowPlace.Register(this);
En la aplicación creas la clase que administra tus ventanas. Consulte el enlace de github anterior para obtener más información.
fuente
Te puede gustar esto:
Cuando se cierra la aplicación:
Cuando se inicia la aplicación:
fuente
Cree una cadena llamada WindowXml en su configuración predeterminada.
Utilice este método de extensión en los eventos de ventana cargada y de cierre para restaurar y guardar el tamaño y la ubicación de la ventana.
fuente
Estoy usando la respuesta de Lance Cleveland y vinculo el ajuste. Pero estoy usando más código para evitar que mi ventana esté fuera de pantalla.
fuente
Hice una solución más genérica basada en la brillante respuesta de RandomEngys. Guarda la posición en el archivo en la carpeta en ejecución y no necesita crear nuevas propiedades para cada nueva ventana que cree. Esta solución funciona muy bien para mí con un código mínimo en el código subyacente.
En su código detrás, agregue estos dos métodos
en la ventana xaml agregas esto
fuente