Привязка всплывающего окна к относительной позиции экрана другого элемента управления - PullRequest
3 голосов
/ 11 июня 2009

Я пишу XBAP со сложным всплывающим окном (Canvas Z-index 99 с сеткой на нем ...), который я хотел бы «прикрепить» к кнопке, которая его открывает, и следуйте этой кнопке, где бы она ни находилась идет на экране. Например, если кнопка находится в ListBox или XamDataGrid, я бы хотел, чтобы всплывающее окно следовало за кнопкой при ее прокрутке. Если он находится под расширителем, я хочу, чтобы он оставался прикрепленным к кнопке, когда расширитель заставляет его двигаться и т. Д.

Есть идеи?

Ответы [ 2 ]

7 голосов
/ 21 января 2010

При использовании Popup ни PlacementTarget, ни CustomPopupPlacementCallback не используются после того, как всплывающее окно появилось изначально. Поэтому любое использование этих свойств не позволит всплывающему окну отслеживать движение кнопки.

Мне приходит несколько способов достичь желаемого:

  1. Прикрепите пользовательский Adorner к кнопке и поместите в нее всплывающее окно. Недостаток: всплывающее окно не связано с кнопкой или окружающими элементами, поэтому оно не будет наследовать свойства и DataContext от них.

  2. Прикрепить пользовательский Adorner к кнопке. Этот рекламодатель будет измерять и организовывать вызовы, когда кнопка перемещается относительно AdornerLayer, что позволяет вам вручную обновить позицию Popup. Пока ваш AdornerDecorator не перемещается относительно вашего Window (например, если он является прямым потомком окна), вы можете легко обнаружить перемещаемый AdornerLayer, отслеживая изменения размера окна. Недостаток: сложный для кодирования и получения прав.

  3. Не используйте Popup вообще. Вместо этого оберните кнопку в <Grid> рядом с <Canvas> с нулевой шириной и высотой и желаемой позицией. Внутри <Canvas> добавьте UserControl для всплывающего окна с соответствующим ZIndex. Он простирается за край Canvas, что прекрасно в WPF. Вместо использования Popup управления просто контролируйте видимость UserControl. Недостаток: на самом деле не будет полностью поверх всех других объектов, не может выходить за пределы окна (хотя может и не быть проблемой для XBAP).

0 голосов
/ 11 июня 2009

Я не уверен, будет ли оно автоматически обновляться для вас или нет, но свойство PlacementTarget позволяет вам указать элемент управления для позиционирования всплывающего окна относительно. Если это не сработает, то, возможно, CustomPopupPlacementCallback подойдет?

...