我正在尝试设计一个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
,高度相同:)
有什么想法吗?
谢谢!
答案 0 :(得分:3)
通常我将PlacementTarget
设置为Bottom
或Right
,然后应用RenderTransform
,将Popup
移动剩余的值。
例如,我可能会使用Placement=Bottom
,然后使用RenderTransform
将弹出式广告(Window.Width - Popup.Width)
向右移动,将Popup.Height
向上移动。您可能甚至不需要根据弹出高度/宽度重新调整因为MSDN说弹出窗口不允许在屏幕外显示,它会自动调整它们的位置以使它们可见
请确保使用RenderTransform
而不是LayoutTransform
,因为在弹出窗口获取后会应用RenderTransforms
,因此ActualHeight
和ActualWidth
会大于0。