我正在使用WPF Popup控件。我希望它出现在我的应用程序窗口中,锚定在窗口的右下角。弹出窗口的实际高度和宽度将根据显示的消息而变化。
如果重要,弹出窗口的内容是一个Border,包装StackPanel,包含多个TextBlocks。
感谢您的帮助。
答案 0 :(得分:4)
使用PlacementTarget,Placement = Left,Horizontal / VerticalOffset
<Popup IsOpen="{Binding ElementName=togglebutton, Path=IsChecked, Mode=TwoWay}"
PlacementTarget="{Binding ElementName=togglebutton}"
Placement="Left"
HorizontalOffset="{Binding ActualWidth, ElementName=togglebutton}"
VerticalOffset="{Binding ActualHeight, ElementName=togglebutton}">
答案 1 :(得分:2)
我刚刚做了类似的事情,它确实不是那么棘手,但确实需要自定义弹出窗口。声明弹出窗口时只需将PlacementMode属性设置为Custom,然后将CustomPopupPlacementCallback属性设置为您要使用的方法。
this.trayPopup.CustomPopupPlacementCallback = GetPopupPlacement;
private static CustomPopupPlacement[] GetPopupPlacement(Size popupSize, Size targetSize, Point offset)
{
var point = SystemParameters.WorkArea.BottomRight;
point.Y = point.Y - popupSize.Height;
return new[] { new CustomPopupPlacement(point, PopupPrimaryAxis.Horizontal) };
}
答案 2 :(得分:0)
这很棘手,并没有简单的答案。 关于你的问题,你说:
弹出窗口的实际高度和宽度将根据不同而变化 正在显示的消息。
您应该没有后顾之忧,这是WPF Popup控件的默认行为。
确保您想要的职位的步骤是:
有关使用Popup的自定义放置的详细信息,请参阅:
答案 3 :(得分:0)
我也一直在尝试做类似的事情,并且更喜欢在XAML中做事。我在多显示器上使用Placement=Left
时遇到问题,因为弹出窗口将跳到另一个屏幕,并且在中间会消失。进行Position=Relative
并通过绑定到将要使用的容器来调整偏移量更加可靠。
<Popup x:Name="RightPopupContainer"
StaysOpen="False"
Placement="Relative"
PlacementTarget="{Binding ElementName=BigContainer}"
Height="{Binding ElementName=BigContainer, Path=ActualHeight}"
AllowsTransparency="True"
PopupAnimation="Fade">
<Popup.HorizontalOffset>
<MultiBinding Converter="{StaticResource SubtractionConverter}">
<MultiBinding.Bindings>
<Binding ElementName="BigContainer" Path="ActualWidth" />
<Binding ElementName="RightPopupContainer" Path="Child.ActualWidth" />
</MultiBinding.Bindings>
</MultiBinding>
</Popup.HorizontalOffset>
</Popup>
SubtractionConverter
是一个简单的多绑定转换器,它从BigContainer.ActualWidth
中减去RightPopupContainer.Child.ActualWidth
(弹出窗口的宽度始终为0,子项的大小)。这样就可以将其精确地放置在容器的边缘,并且在任何一个容器尺寸发生变化时,它都会自动更新。
代替多重绑定,这是另一个执行相同结果的选项。
在包含您的弹出窗口的UserControl或窗口中,在后面的代码中为LayoutUpdated
创建一个事件侦听器。在后面的代码中,您可以执行以下逻辑:
private void UpdateElementLayouts(object sender, System.EventArgs e)
{
if (RightPopupContainer?.IsOpen == true && RightPopupContainer.Child is UserControl content)
{
RightPopupContainer.HorizontalOffset = BigContainer.ActualWidth - content.ActualWidth;
}
}