如何在应用程序的右下角显示WPF弹出窗口?

时间:2011-09-06 01:22:14

标签: wpf

我正在使用WPF Popup控件。我希望它出现在我的应用程序窗口中,锚定在窗口的右下角。弹出窗口的实际高度和宽度将根据显示的消息而变化。

如果重要,弹出窗口的内容是一个Border,包装StackPanel,包含多个TextBlocks。

感谢您的帮助。

4 个答案:

答案 0 :(得分:4)

使用PlacementTarget,Placement = Left,Horizo​​ntal / 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控件的默认行为。

确保您想要的职位的步骤是:

  1. 将PlacementTarget设置为应用程序窗口
  2. 弹出窗口将使用relative而不是绝对值放置,因为起始位置始终是左上角。但确切的位置也与应用程序的边缘有关,这意味着您必须使用自定义展示位置。
  3. 有关使用Popup的自定义放置的详细信息,请参阅:

    How to: Specify a Custom Popup Position

答案 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;
    }
}