Estoy intentando centrar una ventana en la ventana del propietario. También necesito que la ventana secundaria se mueva a lo largo de la ventana del propietario. Se puede encontrar una publicación cruzada en el foro de MSDN WPF here.Los valores superiores e inferiores de la ventana no se actualizan correctamente al maximizar una ventana en .NET 4
Para lograr esto me suscribo a los eventos LocationChanged
y SizeChanged
(y también el evento StateChanged
) del propietario de la ventana de mi hijo. Cuando esos eventos se desencadenan, vuelvo a calcular la ubicación de la ventana secundaria. Lo hago en el código subyacente de la ventana secundaria.
El código es muy sencillo:
Top = Owner.Top + ((Owner.ActualHeight - ActualHeight)/2);
Left = Owner.Left + ((Owner.ActualWidth - ActualWidth)/2);
Si compilar y ejecutar el programa de ejemplo que he proporcionado verá que funciona cuando la ventana principal es tal y como son, y se trasladó alrededor. Entonces esa parte funciona
El problema surge cuando se maximiza la ventana del propietario. (Y después de maximizarlo, vuelve a la normalidad.) Debido a que me suscribo a tres eventos, entro a la función de reubicación tres veces. Después de imprimir los datos del propietario, obtengo resultados diferentes. Lo más molesto es que los valores Top
y Left
de la ventana del propietario están desactivados. Parece que obtiene los valores correctos superior e izquierdo cuando el estado cambia, pero los valores ActualWidth
y ActualHeight
son incorrectos. Cuando se desencadenan los eventos LocationChanged
o SizeChanged
, los valores ActualWidth
y ActualHeight
son correctos, pero los valores superior e izquierdo son incorrectos. Parece que estos son los valores anteriores. ¿Cómo puede ser esto? ¿Qué está causando esto? ¿Y hay una solución adecuada para esto?
Dado que el mismo código parece haber funcionado en .net 3.5, tengo la impresión de que algo cambió en .net 4. (O tuve un problema de sincronización extraño que hizo que el problema no apareciera). Pero no puedo encontrar ningún cambio documentado en esta parte.
.NET 3.5:
OnOwnerLocationChanged
T: -8; L: -8; W: 640; H: 480
OnOwnerStateChanged
T: -8; L: -8; W: 640; H: 480
OnOwnerSizeChanged
T: -8; L: -8; W: 1936; H: 1066
.NET 4.0:
OnOwnerLocationChanged
T: -8; L: -8; W: 640; H: 480
OnOwnerStateChanged
T: 494; L: 33; W: 640; H: 480
OnOwnerSizeChanged
T: 494; L: 33; W: 1936; H: 1066
Así que la pregunta principal sigue siendo: ¿por qué son los valores de izquierda del propietario superior e incorrecto?
encontré un hilo en SO que menciona cómo atrapar la maximiaze/restaurar eventos anulando WndProc: http://stackoverflow.com/questions/1295999/event-when-a-window-gets-maximized-un-maximized Pruebe el código en la respuesta http://stackoverflow.com/a/3382336/137972 – Christoffer
Desde la T y L del evento LocationChanged es correcto, puedo guardarlos en la memoria caché y usar la W y H del evento SizeChanged ya que ese evento viene DESPUÉS del LocationChanged incluso, pero al igual que su sugerencia es una solución. Prefiero ahora por qué este comportamiento es diferente. – Jensen
Estoy haciendo estos cálculos en dos ventanas, en despachadores de diferencias y estoy muy agradecido de haber encontrado esta publicación. Al final, también utilicé el enfoque de almacenamiento en caché. – RichardOD