XAML 如何在WPF中使弹出窗口粘滞到窗口/随窗口移动

ejk8hzay  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(238)

在WPF中,我有一个带有一些按钮的窗口。目前我有以下功能:我单击一个按钮,弹出窗口在按钮下方弹出。

我的目标是在拖动主窗口时,弹出窗口随窗口移动,使弹出窗口保持在按钮下方。

目前我正在使用这段代码,但它似乎不工作-弹出弹出,但当拖动主窗口弹出停留在同一个地方。
下面是我的代码:

private void Window_LocationChanged(object sender, EventArgs e)
    {
        ResetPopUp();
    }

    private void ResetPopUp()
    {
        var offsetHor = popup.HorizontalOffset;
        var offsetVer = popup.VerticalOffset;

        popup.HorizontalOffset = offsetHor + 1;
        popup.HorizontalOffset = offsetHor - 1;

        popup.VerticalOffset = offsetVer + 1;
        popup.VerticalOffset = offsetVer - 1;
    }

我将感激任何答案!

qcuzuvrc

qcuzuvrc1#

下面是我们在代码中使用的内容。也许它能有所帮助。

public MainWindow()
    {
        this.InitializeComponent();
        this.SizeChanged += delegate { this.ResetPopupLocation(); };

        this.LocationChanged += delegate { this.ResetPopupLocation(); };
    }

    private static IEnumerable<Popup> GetOpenPopups()
    {
        return PresentationSource.CurrentSources.OfType<HwndSource>()
            .Select(h => h.RootVisual)
            .OfType<FrameworkElement>()
            .Select(f => f.Parent)
            .OfType<Popup>()
            .Where(p => p.IsOpen);
    }

    private void ResetPopupLocation()
    {
        foreach (var popup in GetOpenPopups())
        {
            var offset = popup.HorizontalOffset;
            popup.HorizontalOffset = offset + 1;
            popup.HorizontalOffset = offset;
        }
    }
aij0ehis

aij0ehis2#

您可以合并弹出窗口的PlacementTarget和Placement属性,以实现相对于父级的定位/居中定位
如果你想让弹出窗口的位置在父对象的中心,请按如下所示

<Popup
            PlacementTarget="{Binding ElementName = "parent_container_windowname"}"
            Placement="Center">
        </Popup>

如果您希望将弹出窗口放置在父对象的左上角,则可以使用Placement=“Relative”

相关问题