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



我正在尝试设计一个弹出窗口,它将出现在其PlacementTarget的右下角

让我们承认你将它的PlacementTarget设置为Window,那么,弹出窗口将作为经典的烤面包机通知。

考虑到WPF不够聪明,无法为我们提供一个"角落"解决方案,我试图实现一个新的控件,继承Popup,它将把自己放在适当的位置。

这是我的第一个想法:工作在Loaded事件,以确定我应该在哪里放置弹出框。问题吗?我不想给弹出框任何固定的尺寸,它应该根据显示的文本大小自己。

然而,当Loaded事件被引发时,我无法获得ActualWidth属性。当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,高度相同:)任何想法?

谢谢!

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

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

请确保您使用RenderTransform而不是LayoutTransform,因为RenderTransforms是在弹出窗口渲染后应用的,所以ActualHeightActualWidth将大于0。

最新更新