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

MAUI非模态固定尺寸可移动弹窗开发及Android适配问题求助

弹窗需求与问题

需求特性

我需要实现一个具备以下特性的弹窗:

  • 非模态(non-modal)
  • 不可调整大小
  • 不可最大化、不可最小化
  • 始终悬浮在主应用窗口上方
  • 用户可在屏幕上拖动移动
  • 随主应用窗口的移动而同步移动

已尝试方案及不足

目前尝试过两种方案,但均无法完全满足需求:

  • 使用CommunityToolkit.Maui.Views.PopUp:无法设置为非模态且支持用户拖动
  • 使用Microsoft.Maui.Controls.Window:无法设置不可调整大小、不可最大化/最小化,也无法始终悬浮在主窗口上方

当前实现及Android端问题

根据提示编写的代码在Windows上运行正常,但在Android模拟器中存在问题:弹窗仅支持左右拖动,无法上下拖动。应用采用纯代码后置开发,相关代码片段如下:

主ContentPage代码

public partial class MyApp : ContentPage
{
    // ...
    private static PanContainer panContainer = null;
    private static MyMovablePopUp popUp = null;
    // ...

    public MyApp() : base()
    {
        InitializeComponent();
        
        ScrollView sv = new ScrollView();
        this.Content = sv;
        sv.HorizontalScrollBarVisibility = ScrollBarVisibility.Default;
        sv.VerticalScrollBarVisibility = ScrollBarVisibility.Default;

        Grid baseZStack = new Grid(); // The base stack for the overlay (ZIndex) of the PopUp (+ PanContainer) over the main content page
        sv.Content = baseZStack;

        // the control that contains all elements of the main content page
        VerticalStackLayout vsl = new VerticalStackLayout();
        baseZStack.Children.Add(vsl);
        vsl.ZIndex = 1;
        vsl.Padding = new Thickness(LEFT_RIGHT_MARGIN, 0, LEFT_RIGHT_MARGIN, LEFT_RIGHT_MARGIN);
        vsl.Spacing = 5;
        vsl.VerticalOptions = LayoutOptions.Start;
        vsl.HorizontalOptions = LayoutOptions.Start;

        // the control that contains the MyMovablePopUp
        panContainer = new PanContainer();
        baseZStack.Children.Add(panContainer);
        panContainer.ZIndex = 2;
        popUp = new MyMovablePopUp(this);
        panContainer.IsVisible = false;
        panContainer.Content = popUp;

        // ...  
    }
}

弹窗定义

internal class MyMovablePopUp : Border
{
    private readonly MyApp app;
    // ...
    internal MyMovablePopUp(MyApp app) : base()
    {
        this.app = app;
        this.MinimumWidthRequest = 140;
        this.MaximumWidthRequest = this.MinimumWidthRequest;
        this.MinimumHeightRequest = 290;
        this.MaximumHeightRequest = this.MinimumHeightRequest;
        
        // ... add content
    }
}

PanContainer实现

public class PanContainer : ContentView
{
    double panX, panY;

    public PanContainer()
    {
        PanGestureRecognizer panGesture = new PanGestureRecognizer();
        panGesture.PanUpdated += OnPanUpdated;
        GestureRecognizers.Add(panGesture);
    }

    void OnPanUpdated(object sender, PanUpdatedEventArgs e)
    {
        switch (e.StatusType)
        {
            case GestureStatus.Running:
                Content.TranslationX = panX + e.TotalX; 
                Content.TranslationY = panY + e.TotalY;
                break;

            case GestureStatus.Completed:
                panX = Content.TranslationX;
                panY = Content.TranslationY;
                break;
        }
    }
}

现寻求解决Android模拟器中弹窗无法上下拖动的问题,或能完全满足需求的其他实现方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:35:08