Всплывающее окно появится в правом нижнем углу его родителя - PullRequest
2 голосов
/ 23 декабря 2011

Я пытаюсь создать всплывающее окно, которое появится в правом нижнем углу его PlacementTarget

Допустим, вы установили для PlacementTarget значение Window, ну и всплывающее окно будет действовать как классические уведомления тостера.

Учитывая тот факт, что WPF недостаточно умен, чтобы предоставить нам «угловое» решение, я пытаюсь реализовать новый элемент управления, наследующий от Popup, который будет располагаться в соответствующем месте.

Вот моя первая идея: поработать над событием Loaded, чтобы определить, где я должен разместить всплывающее окно. Проблема? Я не хочу задавать всплывающие размеры фиксированного размера, размер которого должен соответствовать самому отображаемому тексту.

Однако я не могу получить свойство ActualWidth при возникновении события Loaded. Я также не могу получить его, когда событие Opened поднято.

Вот предварительный код:

public class ExceptionPopup : Popup
{
       public ExceptionPopup()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(ExceptionPopup_Loaded);
        }

        void ExceptionPopup_Loaded(object sender, RoutedEventArgs e)
        {
            if (PlacementTarget != null)
            {
                if (PlacementTarget is FrameworkElement)
                {
                    parentWidth = (PlacementTarget as FrameworkElement).ActualWidth;
                    parentHeight = (PlacementTarget as FrameworkElement).ActualHeight;
                }
            }
        }

        protected override void OnOpened(EventArgs e)
        {
            this.HorizontalOffset = parentWidth;
            this.VerticalOffset = parentHeight;
            base.OnOpened(e);
        }
}

Есть ли другое событие, которое я мог бы использовать, чтобы поймать то, что я хочу здесь? Я бы хотел установить HorizontalOffset на parentWidth - ActualWidth/2, то же самое для высоты :) Есть идеи?

Спасибо!

1 Ответ

3 голосов
/ 28 декабря 2011

Обычно я устанавливаю PlacementTarget на Bottom или Right, затем применяю RenderTransform, который сдвигает Popup на оставшееся значение.

Например, я мог бы использовать Placement=Bottom, затем использовать RenderTransform для смещения всплывающего окна (Window.Width - Popup.Width) вправо и Popup.Height вверх.Вам может даже не потребоваться перенастройка в зависимости от высоты / ширины всплывающего окна, поскольку MSDN сообщает, что всплывающие окна не могут отображаться вне экрана, и автоматически настраивает их расположение, чтобы они оставались видимыми

Убедитесьиспользуйте RenderTransform вместо LayoutTransform, потому что RenderTransforms будет применено после того, как всплывающее окно будет отображено, поэтому ActualHeight и ActualWidth будут больше 0.

...