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
相关产品推荐
相关产品推荐

