wpf popup screen position xbap

wpf - Enlazando una ventana emergente a la posición de pantalla relativa de otro control



popup screen (2)

No estoy seguro de si se actualizará automáticamente o no, pero la propiedad PlacementTarget le permite especificar un control para colocar la ventana emergente en relación con. Si eso no funciona, entonces tal vez CustomPopupPlacementCallback hará el truco?

Estoy escribiendo un XBAP con un Popup complejo (Canvas Z-index de 99 con una grilla en él ...) que me gustaría "adjuntar" al botón que lo abre y seguir ese botón donde sea que vaya en el pantalla. Por ejemplo, si el botón está en un ListBox o un XamDataGrid, me gustaría que la ventana emergente siga el botón mientras se desplaza. Si está debajo de un expansor, quiero que permanezca unido al botón cuando el expansor lo fuerza a moverse, etc.

¿Algunas ideas?


Cuando se utiliza una CustomPopupPlacementCallback Popup , ni PlacementTarget ni CustomPopupPlacementCallback se usan después de que la ventana emergente haya aparecido originalmente. Por lo tanto, cualquier uso de estas propiedades no permitirá que la ventana emergente rastree el botón mientras se mueve.

Se me ocurren varias maneras de lograr lo que desea:

  1. Adjunte un Adorner personalizado al botón y coloque la ventana emergente dentro de él. Desventaja: Popup no está conectado al botón o elementos circundantes, por lo que no heredará propiedades y DataContext de ellos.

  2. Adjunte un Adorner personalizado al botón. Este adornador obtendrá medidas y organizará las llamadas cuando el botón se mueva en relación con AdornerLayer , lo que le permite actualizar manualmente la posición Popup . Siempre que su AdornerDecorator no se mueva en relación con su Window (por ejemplo, si es el hijo directo de la Ventana), puede detectar fácilmente la AdornerLayer se mueve al monitorear los cambios al tamaño de la Ventana. Desventaja: complejo de codificar y hacer las cosas bien.

  3. No use una Popup en absoluto. En su lugar, ajuste el botón en una <Grid> junto a un <Canvas> con ancho y alto cero y la posición deseada. Dentro de <Canvas> agregue el UserControl para la ventana emergente con un ZIndex apropiado. Se extenderá más allá del borde del lienzo, que está bien en WPF. En lugar de usar un control Popup simplemente controle la visibilidad del UserControl . Desventaja: en realidad no estará totalmente encima de todos los demás objetos, no puede extenderse fuera del borde de la ventana (sin embargo, puede no ser un problema para XBAP).