Description
Title: IDialogService popup with CloseOnBackgroundTapped="True" does not dismiss on iOS (Mopups container missing the dismiss mask)
This is the iOS counterpart to #3322 ("CloseOnBackgroundTapped not honored"),
which was closed as fixed on the private feed. On Prism.Plugin.Popups.Maui
9.1.33-pre the flag is now plumbed correctly, but the popup still does not
dismiss on background tap on iOS. I traced it to the container layout.
Environment
Prism.DryIoc.Maui 9.1.111-pre, Prism.Maui 9.1.86-pre
Prism.Plugin.Popups.Maui 9.1.33-pre, Mopups 1.3.4
- .NET 10,
net10.0-ios, iOS 26 simulator + device
Root cause
The flag is read and applied — Prism.Maui's DialogServiceBase reads
DialogLayout.GetCloseOnBackgroundTapped(view) and passes it to
PopupDialogContainer.ConfigureLayout, which sets
((PopupPage)this).CloseWhenBackgroundIsClicked = hideOnBackgroundTapped.
The problem is the layout. PopupDialogContainer.GetContentLayout builds a
screen-filling AbsoluteLayout with the dialog as a centered child, then
leans on Mopups' CloseWhenBackgroundIsClicked to detect a background tap. But
that mechanism only fires for a tap outside the content frame — and the
AbsoluteLayout fills the whole page, so on iOS every tap is "inside content"
and the background tap is never recognized.
By contrast, Prism.Maui's default container DialogContainerPage does not
rely on Mopups detection — it adds a BoxView mask with a
TapGestureRecognizer bound to the dismiss command. PopupDialogContainer is
simply missing that mask.
Suggested fix
Give PopupDialogContainer the same mask + gesture that DialogContainerPage
already uses, instead of depending on CloseWhenBackgroundIsClicked. A minimal
override that does exactly this (drop-in proof, in the repro):
protected override View GetContentLayout(Page currentPage, View dialogView,
bool hideOnBackgroundTapped, ICommand dismissCommand, IDialogParameters parameters)
{
var content = base.GetContentLayout(currentPage, dialogView, hideOnBackgroundTapped,
dismissCommand, parameters);
if (hideOnBackgroundTapped && content is AbsoluteLayout layout)
{
var scrim = new BoxView { Color = Colors.Transparent };
AbsoluteLayout.SetLayoutFlags(scrim, AbsoluteLayoutFlags.All);
AbsoluteLayout.SetLayoutBounds(scrim, new Rect(0, 0, 1, 1));
scrim.GestureRecognizers.Add(new TapGestureRecognizer { Command = dismissCommand });
layout.Children.Insert(0, scrim); // behind the dialog
}
return content;
}
Steps to Reproduce
Repro
Minimal repo: [prism-popup-dismiss-repro]
UsePrism(... .ConfigureMopupDialogs() ...), register a dialog whose root sets
prism:DialogLayout.CloseOnBackgroundTapped="True".
IDialogService.ShowDialog(...) it on iOS.
- Tap the dimmed background.
Expected: dialog dismisses. Actual: dialog stays open.
Platform with bug
.NET MAUI
Affected platforms
iOS
Did you find any workaround?
No response
Relevant log output
Description
Title:
IDialogServicepopup withCloseOnBackgroundTapped="True"does not dismiss on iOS (Mopups container missing the dismiss mask)This is the iOS counterpart to #3322 ("CloseOnBackgroundTapped not honored"),
which was closed as fixed on the private feed. On
Prism.Plugin.Popups.Maui9.1.33-pre the flag is now plumbed correctly, but the popup still does not
dismiss on background tap on iOS. I traced it to the container layout.
Environment
Prism.DryIoc.Maui9.1.111-pre,Prism.Maui9.1.86-prePrism.Plugin.Popups.Maui9.1.33-pre,Mopups1.3.4net10.0-ios, iOS 26 simulator + deviceRoot cause
The flag is read and applied —
Prism.Maui'sDialogServiceBasereadsDialogLayout.GetCloseOnBackgroundTapped(view)and passes it toPopupDialogContainer.ConfigureLayout, which sets((PopupPage)this).CloseWhenBackgroundIsClicked = hideOnBackgroundTapped.The problem is the layout.
PopupDialogContainer.GetContentLayoutbuilds ascreen-filling
AbsoluteLayoutwith the dialog as a centered child, thenleans on Mopups'
CloseWhenBackgroundIsClickedto detect a background tap. Butthat mechanism only fires for a tap outside the content frame — and the
AbsoluteLayoutfills the whole page, so on iOS every tap is "inside content"and the background tap is never recognized.
By contrast, Prism.Maui's default container
DialogContainerPagedoes notrely on Mopups detection — it adds a
BoxViewmask with aTapGestureRecognizerbound to the dismiss command.PopupDialogContainerissimply missing that mask.
Suggested fix
Give
PopupDialogContainerthe same mask + gesture thatDialogContainerPagealready uses, instead of depending on
CloseWhenBackgroundIsClicked. A minimaloverride that does exactly this (drop-in proof, in the repro):
Steps to Reproduce
Repro
Minimal repo: [prism-popup-dismiss-repro]
UsePrism(... .ConfigureMopupDialogs() ...), register a dialog whose root setsprism:DialogLayout.CloseOnBackgroundTapped="True".IDialogService.ShowDialog(...)it on iOS.Expected: dialog dismisses. Actual: dialog stays open.
Platform with bug
.NET MAUI
Affected platforms
iOS
Did you find any workaround?
No response
Relevant log output