我正在尝试设计一个弹出窗口,它将出现在其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
设置为Bottom
或Right
,然后应用RenderTransform
,将Popup
移动剩余的值。
例如,我可能使用Placement=Bottom
,然后使用RenderTransform
将弹出框(Window.Width - Popup.Width)
向右移动,Popup.Height
向上移动。你甚至可能不需要根据弹出窗口的高度/宽度重新调整,因为MSDN说弹出窗口不允许显示在屏幕外,它会自动调整它们的位置以保持它们可见
请确保您使用RenderTransform
而不是LayoutTransform
,因为RenderTransforms
是在弹出窗口渲染后应用的,所以ActualHeight
和ActualWidth
将大于0。