弹出窗口显示在其父级的右下角

时间:2011-12-23 16:28:47

标签: wpf popup dimensions

我正在尝试设计一个Popup,它将出现在PlacementTarget

的右下角

我们承认您将PlacementTarget设置为Window,好吧,Popup将充当经典的烤面包机通知。

鉴于WPF不够聪明,无法为我们提供“角落”解决方案,我正在尝试实施一个新的控件,继承自Popup,它将自己置于适当的位置。

这是我的第一个想法:处理Loaded事件以确定我应该在哪里放置Popup。 问题?我不想给弹出窗口提供任何固定的尺寸,弹出窗口应根据显示的文本自行调整大小。

但是,当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 个答案:

答案 0 :(得分:3)

通常我将PlacementTarget设置为BottomRight,然后应用RenderTransform,将Popup移动剩余的值。

例如,我可能会使用Placement=Bottom,然后使用RenderTransform将弹出式广告(Window.Width - Popup.Width)向右移动,将Popup.Height向上移动。您可能甚至不需要根据弹出高度/宽度重新调整因为MSDN说弹出窗口不允许在屏幕外显示,它会自动调整它们的位置以使它们可见

请确保使用RenderTransform而不是LayoutTransform,因为在弹出窗口获取后会应用RenderTransforms,因此ActualHeightActualWidth会大于0。