You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP中Popup.ShouldConstrainToRootBounds为false时ContentDialog无法显示在Popup上方

问题解决:ContentDialog在Popup下方显示的问题

问题原因

当设置Popup.ShouldConstrainToRootBounds=false时,Popup会脱离应用主窗口的根可视化树约束,创建独立的窗口容器。而默认调用ContentDialog.ShowAsync()时,ContentDialog会绑定到应用主窗口的XamlRoot,导致它的窗口层级低于Popup的独立容器,因此会显示在Popup下方。

解决方案

在显示ContentDialog前,将它的XamlRoot属性设置为Popup内部元素的XamlRoot,确保两者处于同一个可视化层级。修改后的代码如下:

修改后的C#代码

private Popup popup;

private void Button_Click(object sender, RoutedEventArgs e)
{
    popup = new Popup { Margin = new Thickness(200, 300, 0, 0), ShouldConstrainToRootBounds = false };
    Border border = new Border { Width = 400, Height = 300, Background = new SolidColorBrush(Colors.Green) };
    Button popupButton = new Button { Content = "Open Content Dialog", Width = 200, Height = 50 };
    border.Child = popupButton;
    popupButton.Click += PopupButton_Click;
    popup.Child = border;
    popup.IsOpen = true;
}

private async void PopupButton_Click(object sender, RoutedEventArgs e)
{
    ContentDialog contentDialog = new ContentDialog
    {
        Title = "ContentDialogOverPopup",
        Content = "Content Dialog",
        CloseButtonText = "Ok",
        // 关键:绑定到Popup内部元素的XamlRoot
        XamlRoot = ((Button)sender).XamlRoot
    };
    await contentDialog.ShowAsync();
}

说明

通过将ContentDialog的XamlRoot设置为触发按钮的XamlRoot(即Popup的XamlRoot),ContentDialog会被渲染到Popup所在的同一个窗口容器中,自然显示在Popup上方,不受ShouldConstrainToRootBounds设置的影响。

内容的提问来源于stack exchange,提问作者PremKumar Shanmugam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:05:48