Repository navigation
[AI-Suggested] Content update request from Product Release signal: maui 10.0.110 #3560
Description
Background
A recent product update has been released that may impact our documentation. This could include new features, changes to existing functionality, or other product enhancements.
Your Action Required: Please review the suggestions below and update the relevant documentation to ensure accuracy and completeness.
Signal Details:
- Title: maui 10.0.110
- Source URL: https://github.com/dotnet/maui/releases/tag/10.0.110
- Repository: https://github.com/dotnet/maui
- ReleaseWindowUtc: 2026-09-07 17:13:51Z - 2026-09-22 16:32:41Z
- TargetBranch: release/10.0.1xx-sr11
- currentTag: 10.0.110
- targetCommitish: release/10.0.1xx-sr11
- releaseUrl: https://github.com/dotnet/maui/releases/tag/10.0.110
- previousTag: 10.0.101
Source Signal Summary
Details
- .NET MAUI Controls:
SwipeItemView.Command(SwipeView) now usesWeakCommandSubscriptioninstead of a strongICommand.CanExecuteChangedevent handler, preventingSwipeItemView(and its visual subtree) from being kept alive when bound to long-lived commands that raiseCanExecuteChangedvia strong events (e.g., customICommand/ CommunityToolkitRelayCommand); public API is unchanged andIsEnabled/CanExecutebehavior remains the same, but the command subscription lifetime no longer causes a memory leak when views are discarded/unloaded.ListView.RefreshCommandsimilarly now usesWeakCommandSubscriptionso long-lived/customICommandimplementations don’t preventListView(and its cells/binding context) from being garbage-collected when the control is unloaded. (PR #36357, PR #36369) - .NET MAUI Controls memory-leak fixes via weak event subscriptions / deterministic unsubscription:
IndicatorView.ItemsSourceuses aWeakNotifyCollectionChangedProxy(andIndicatorView.~IndicatorView()unsubscribes) soIndicatorViewcan be collected even when bound to a long-livedObservableCollection;TableView/TableView.Rootavoids retainingTableView/TableRootvia strong event subscriptions whenTableRoot(orTableSection) is shared/long-lived;GeometryGroupuses weak collection/property subscriptions and is null-safe whenChildrenis null or contains null entries;FormattedString.Spansuses per-occurrence weak subscriptions so a sharedSpaninstance doesn’t keep discardedFormattedStrings alive;GradientBrushunsubscribesGradientStop.PropertyChangedonGradientStops.Clear()/Reset so cleared stops don’t remain subscribed; XAML binding diagnosticsBindingDiagnostics.BindingFailedis now backed byWeakEventManager(weak subscriptions), so subscribers must manage their own lifetime if they expect to keep receiving events. (PR #36252, PR #36513, PR #36526, PR #36294, PR #36746, PR #37645) - In .NET MAUI SwipeView (
SwipeItem/ISwipeItemMenuItem),SwipeItem.BackgroundColorchanges driven byAppThemeBindingnow correctly propagate to the native control becauseBackgroundColorPropertyraises a handler update forISwipeItemMenuItem.Backgroundand theSwipeItemMenuItemHandlerproperty mapper is keyed toISwipeItemMenuItem.Background(notIView.Background); additionally on iOS and Windows, updating the swipe item background now also triggers a refresh ofITextStyle.TextColor. On Android, revealed swipe-item commands now execute when activated via accessibility services (TalkBack) by handlingACTION_CLICKand applying existingSwipeBehaviorOnInvokedbehavior; and Android swipe-item layout now measures swipe item height withMeasureSpecMode.AtMostto improve vertical centering/avoid over-constraining height. On Windows, placing aSwipeView(WinUISwipeControl) directly inside aBorderno longer causes a native crash, but theSwipeViewcontent will not have its corners clipped to theBordershape (stroke/path still renders). (PR #36271, PR #37143, PR #38301, PR #36714) - CarouselView/CollectionView behavior fixes across platforms:
- CarouselView consistently honors
IsSwipeEnabledandIsBounceEnabled(iOS/Mac Catalyst now applies settings to the embedded orthogonalUIScrollViewcreated byUICollectionViewCompositionalLayout; Android now blocks scrolling even when touch dispatch goes directly toOnTouchEvent). - iOS/Mac Catalyst CarouselView re-synchronizes
Position/CurrentItemwhen the handler re-attaches (treatsPositionas source of truth if it changed while detached; otherwise preserves prior CurrentItem-based restore to better handle collection mutations; cancels iOS scroll debounce on teardown and guards invalid indices); and iOS also honors a newly setCurrentItemafter an off-screen/detached CarouselView has itsItemsSourcereplaced (avoids restoring stalePosition). - Android CarouselView handles
INotifyCollectionChanged.Replacewithout resetting to position 0; inLoop=true, rebinding is limited to visible loop “virtual” cells to avoid adapter rebuild jumps/flash and spurious events, with additional guards against teardown/dispatch races. - Mac Catalyst CollectionView/CarouselView fixes programmatic, non-animated
ScrollTo/ScrollToItemnear the end silently being clamped/reset by UIKit during window state changes by tracking/restoring post-scroll position, while clearing pending restore on user drag and on ItemsSource/layout changes. - CollectionView (Items2/CV2) on iOS/Mac Catalyst collapses to zero size when it has no items and no
EmptyViewis displayed (instead of expanding to fill available space), and forces a temporary layout pass when frame is still zero in the scroll direction to let compositional layout compute content size. - CollectionView grouping with
GridItemsLayoutis now more consistent: Windows grouped grid item containers stretch vertically; iOS/Mac Catalyst applies group header/footer-to-items spacing for grid layouts via section insets plusInterSectionSpacing. - iOS Items2 CollectionView now supports
RefreshViewpull-to-refresh even when theEmptyViewis displayed (keeps empty-view host insideUICollectionViewso pan gestures reach the scroll view; preserves RTL/LTR by separately applyingFlowDirectionand counter-transforming the empty-view host). - Android grouped CollectionView item removal no longer intermittently crashes (
ArgumentOutOfRangeException) due to adapter null/position range checks inSpacingItemDecoration. (PR #36428, PR #36287, PR #36681, PR #36243, PR #36431, PR #36127, PR #36561, PR #38296, PR #38482) - .NET MAUI
ScrollViewon iOS/Mac Catalyst changed scrolling/offset semantics to account for safe area/platform content insets:ScrollX/ScrollYandScrolledEventArgsnow use inset-aware “content coordinates” (resting position reports0instead of-AdjustedContentInset.Top);ScrollToAsync/IScrollView.RequestScrollTois translated/clamped againstUIScrollView.AdjustedContentInsetso scrolling to start/end and element-target scrolling land in the visible viewport; deferredScrollToAsyncrequests made before handler/layout exists now complete reliably (wait for valid geometry/content arrangement), but pending element scroll requests are “parked” until geometry is valid and then dropped and completed without scrolling if theScrollViewlifecycle ends (handler disconnected/removed/reparented) or the target becomes orphaned becauseScrollView.Contentwas replaced/removed; and iOS/Mac CatalystScrollViewHandler.PlatformArrange(Rect)now preserves the currentUIScrollView.ContentOffsetacross parent-driven resizes (clamps to valid range) to avoid unintended scroll jumps. (PR #37060, PR #37837, PR #37393, PR #38602) - .NET MAUI (Android) safe area / window insets behavior changes: correctly honors
SafeAreaEdges=Nonewhen aNavigationPageorShellnavigation bar is hidden at runtime (clears staleAppBarLayoutpadding); RTL mirroring inPlatformArrangeHandlernow mirrors child bounds within the parent’s padded content box (fixes asymmetric safe-area padding shifting RTL content into cutouts); during IME animations, views that attach while an animation is in flight bypass the “IsImeAnimating” inset-dispatch gate for one valid dispatch (avoids first-frame “no padding” jump) and settled insets are re-applied reliably at animation end; and the “vertical safe-area animation” heuristic now only applies the full top inset when a translated view covers the usable screen height (smaller translated controls no longer retain extra top padding). (PR #36072, PR #36586, PR #37049, PR #38295) - .NET MAUI iOS safe-area behavior (
SafeAreaEdges,MauiView,MauiScrollView) changed to resolve parent/ancestor “safe area already applied” blocking per-edge (Left/Top/Right/Bottom) and to invalidate safe-area calculations across descendants (InvalidateSafeAreaWithDescendants), intended to prevent double-padding and layout loops when parent/child views handle different safe-area edges and during keyboard transitions. (PR #38301) - .NET MAUI
Buttonon iOS/Mac Catalyst fixes/changes: correctly refreshesCharacterSpacingformatting whenTextchanges (includingTextTransform/ContentLayoutscenarios) and ensuresUIButton.TitleLabel.Textis synced; correctly updatesTextColor(including resetting tonull) whenCharacterSpacingis set by updating/removing attributed-titleForegroundColor; on iOS/Mac Catalyst,Button.ContentLayout(Left/Right image positions with spacing) now usesEffectiveFlowDirectionso RTL layouts preserve expected image/text spacing; and iOSUpdateBackgroundno longer forcesBackgroundColor = UIColor.Clearwhen background paint becomes null/empty during initial handler connection whileUIButton.Windowis still null (preserves nativeBackgroundColorset by customUIButtonsubclasses until attached, while still clearing gradients consistently). (PR #36326, PR #36699, PR #38339, PR #38301) - .NET MAUI
Entrycross-platform behavior fixes: Windows no longer raisesEntry.Completedwhen the user presses Enter to confirm a Chinese/Japanese IME candidate (Completed fires only on a real EnterKeyDown+KeyUpsequence); iOS/Mac Catalyst clear button tinting matchesTextColorat full opacity whenClearButtonVisibilityis enabled; iOS and Windows now respectEntry.IsPasswordeven whenEntry.Keyboardis set toKeyboard.Password(developers can setIsPassword=false, including runtime toggles on Windows, without it being overwritten); AndroidEntrywithKeyboard="Numeric"now accepts the OS-locale decimal separator by fixing how password-variation flags are cleared from AndroidInputType. (PR #36577, PR #36472, PR #36677, PR #38483) - .NET MAUI
Label.FormattedTextchanges/fixes: on iOS/Mac Catalyst, span tap hit-testing now uses line metrics aligned with CoreText on iOS 16+ (NSLayoutManager.UsesFontLeading = false) and prefers MAUIfinalSizeoverUILabel.Bounds; on Windows, updating/replacing theFormattedStringclears any previously applied nativeTextBlock.TextHighlighters; Windows formatted-text layout now guards against zero/negative measured line heights to prevent an infinite loop/hang when a formatted label is initialized while collapsed and then shown; and on iOS/Mac Catalyst, RTL layout is correctly applied toFormattedText/spans (usesEffectiveFlowDirection, setsNSParagraphStyle.BaseWritingDirection, mirrorsTextAlignment.Start/End, and rebuilds formatted text on flow-direction changes). (PR #36564, PR #36608, PR #36828, PR #36277) - .NET MAUI
Image/ImageButtonhandler background behavior: on iOS/Mac Catalyst, settingBackgroundColor/Backgroundback tonullnow removes the native background layer and clears native backgrounds (previous background no longer “sticks”), explicitly handlesImageSourcePaintbackgrounds via async image-source loading, and re-appliesIView.Opacityafter background/container transitions to avoid compounded/incorrect opacity; on Windows, changingBackgroundColor/Backgroundvia binding no longer crashes with a COMException after navigating away because container creation is deferred untilPlatformView.IsLoadedand background is applied on reload (Loadedevent). (PR #36427, PR #36747) - .NET MAUI
FlexLayoutfixes: measures children using constraints that account for margins and clamps the cross-axis measure constraint to the final size passed by the flex engine, fixing wrapping content (e.g.,LabelwithLineBreakMode=WordWrap) rendering with truncated/cut-off text; and on Windows/WinUI,FlexLayoutno longer throwsNullReferenceExceptionduring late layout/measure after being detached/recycled in virtualized templates (Layout(...)no-ops when detached, measure returnsSize.Zero, flex frame returnsRect.Zero). (PR #36416, PR #36946) - .NET MAUI Shell behavior/styling fixes:
SearchHandler.ShowsResultsruntime updates are now honored across Android, iOS/Mac Catalyst, and Windows (results UI and population update immediately when toggled); Shell flyout item labelTextColoron Android is applied at the lowestSetterSpecificityso user styles override it (implicitStyle TargetType="Label"and explicit/classFlyoutItemLabelStyle); on Windows,SearchHandlernow correctly appliesFontFamily,FontSize, andFontAttributesto the nativeAutoSuggestBox; on Windows, runtime add/remove ofShellContentnow correctly propagatesShellContent.Titlechanges to parent menu titles;ContentPage.HideSoftInputOnTapped(Android/iOS) is now evaluated per currently focused view’s enclosingContentPage, fixing a Shell navigation edge case where it could get stuck enabled globally; and on Windows, callingShell.Items.Clear()and then navigating no longer leaks old pages (prior section pages are disconnected when the previous section is no longer attached). (PR #36215, PR #36616, PR #36700, PR #35998, PR #36238, PR #36872) - .NET MAUI WebView behavior changes/fixes: on iOS/Mac Catalyst, loading
HtmlWebViewSourcerecords proper back/forward history entries soGoBack()/GoForward()work after loading HTML (iOS 15+/Mac Catalyst 15+ usesWKWebView.LoadSimulatedRequest; older versions fall back toLoadHtmlStringwith base URL preserved). On Windows (WebView2),https://appdir/detection/serving is tightened (must be parsedhttpsabsolute URI with no userinfo and host exactlyappdir; navigation to non-appdirclears mapping) and the folder mapping usesCoreWebView2HostResourceAccessKind.DenyCors, which blocks cross-originfetch/XHR tohttps://appdir/...fromLoadHtml/NavigateToString(null-origin) content or cross-origin iframes. (PR #33183, PR #36603, PR #37393) - .NET MAUI Android WebView/BlazorWebView now explicitly sets
Android.Webkit.WebSettings.MinimumFontSizeandMinimumLogicalFontSizeto1(instead of default8), preventing silent clamping of CSSfont-sizevalues below 8px (very small CSS fonts render at the specified size). (PR #36559, PR #37393) - .NET MAUI BlazorWebView on Android changes its Blazor startup/interop bridge and external navigation handling: startup script is idempotent (
window.__BlazorStartingguard),window.__BlazorStartedis set only afterBlazor.start()resolves, JS-to-native messaging uses a capturedwindow.__nativePortand native-to-JS dispatch routesPostWebMessagefrom windowmessagetowindow.external.__callbackwhile ignoring non-native messages (event.source === null); and external-link handling now creates a sanitizedIntentforintent://orandroid-app://URIs (forces implicit + browsable, clears component/selector, masks flags to an allowlist) beforeStartActivity. (PR #35053, PR #38126, PR #37393) - .NET MAUI HybridWebView changes: JavaScript→.NET messages are now ignored (with debug logging) unless the message
Source/frame URL is an absolute URI under the configuredAppOriginUri(Windows WebView2 + iOS WKWebView), and the JS-to-.NET invocation setup and registration behavior changed soHybridWebViewHandler/IHybridWebViewTaskManagerare registered only whenRuntimeFeature.IsHybridWebViewSupportedis enabled (not registered under NativeAOT/TrimMode=Full); the JS↔.NET invocation contract is reflection-based with dynamicSystem.Text.Jsonannotated[RequiresUnreferencedCode]/[RequiresDynamicCode], and the prior trimming-friendly overloads/interfaces introduced earlier were removed/replaced. (PR #38126, PR #38155, PR #37393) - .NET MAUI XAML C# expressions (XEXPR) / compiled bindings/source generator: supports xmlns-prefixed type references in expressions and attached bindable property reads via
target.(Type.Property)syntax (e.g.,{myButton.(Grid.Row)}/{this.(ios:Page.UseSafeArea)}), rewriting toType.GetProperty(target)and rejecting standalone{(Type.Property)}with a diagnostic instructing users to qualify with a target; validates identifiers inside interpolated strings and reportsMAUIX2009 (MemberNotFound)instead of cryptic C# compiler errors; addsMAUIX2017 (LambdaMethodGroupReference)for lambda bodies that are method groups (suggestsOnClicked(s, e)); addsMAUIX2015/MAUIX2016forx:Codeplacement andx:Classrequirements; and supports TwoWay binding setters for struct sub-property paths (copy–modify–writeback), omitting the setter when a struct intermediate has no public setter and reportingMAUIX2018 StructIntermediateNotSettable(warning) (renumbered fromMAUIX2017). (PR #35007, PR #35093, PR #35006, PR #36787, PR #37393) - .NET MAUI XamlC/XAML parsing and XAML build defaults reverted/changed: XamlC removes the duplicate property assignment warning (
XC0067), stops throwing a build error forx:Sharedusage (previouslyXC0129), and changes obsolete-member reporting to a generic warning-only path (XC0618); implicit XML namespace handling for both XamlC and XamlLoader is gated by[assembly: Microsoft.Maui.Controls.Xaml.Internals.AllowImplicitXmlnsDeclarationAttribute](without it, parsing is treated as a full document and implicit default xmlns/prefix injection does not occur). Build targets revert XAML inflator/Hot Reload defaults/knobs by removing the “XAML Incremental Hot Reload (XIHR)” flow and restoring configuration-based defaults forMauiXamlInflator(Debug →Runtime, non-Debug →XamlC), while templates now generate projects with<MauiXamlInflator>SourceGen</MauiXamlInflator>by default and allow per-file override viaMauiXamlitem metadataInflator. (PR #38155) - .NET MAUI iOS keyboard “Done” accessory on iOS 26+: default accessory becomes a pass-through container with a floating 44×44 “X” glass button so transparent areas no longer block hit-testing beneath; iOS < 26 preserves the full-width translucent
UIToolbarDone button (44-pt height unchanged). A default-off AppContext switchMicrosoft.Maui.Platform.iOS.UseLegacyDoneAccessoryopts out of the iOS 26+ floating behavior and restores the legacy toolbar; the switch must be set before creating MAUI controls. (PR #36413, PR #36776, PR #37393) - .NET MAUI templates + iOS/Mac Catalyst lifecycle: app templates for iOS/Mac Catalyst now generate UIKit scene-based lifecycle by default (
UIApplicationSceneManifestinInfo.plist,SceneDelegatederived fromMauiUISceneDelegate, configuration name__MAUI_DEFAULT_SCENE_CONFIGURATION__, still single-window viaUIApplicationSupportsMultipleScenes=false), raise default Mac CatalystSupportedOSPlatformVersionto 17.0 (iOS remains 15.0), and introduce a scene quick-action APIMauiUISceneDelegate.PerformAction(UIWindowScene, UIApplicationShortcutItem, Action<bool>). In runtime lifecycle events,PerformActionForShortcutItemhandling now uses an aggregated completion model where each handler must invoke its completion callback exactly once, and native completion is delayed until handlers have returned and at least one reports handled (scene-delivered quick actions also flow through these registrations). (PR #38664) - .NET MAUI (iOS): Fixed non-Shell
NavigationPagelarge-title collapse behavior on iOS 26+ so large titles now correctly collapse/expand when the page’s primary scrollable content is wrapped inside layouts (e.g.,Grid,ContentView), covering wrappedScrollView,ListView(obsolete),CollectionView/ItemsView,TableView, andWebView. (PR #36511) - .NET MAUI Controls on iOS/Mac Catalyst:
DatePicker.BackgroundandTimePicker.Backgroundnow clear the native background when set tonull/empty paint at runtime (previously could remain visible).Switch.ThumbColornow correctly reverts to platform/theme default when set back tonull(iOS setsThumbTintColor=null; Android rebuilds default themeThumbTintList; Windows removes overridden knob-fill resources and refreshes theme resources). (PR #36934, PR #36750) - .NET MAUI on Windows (UI/controls):
Border.StrokeLineCapnow also updates WinUIPath.StrokeDashCapso dashedBorderstrokes respect line cap settings;LayoutPanelpreserves a non-nullBackgroundbrush even whenInputTransparent=true(background remains visible); modal navigation in full-screen no longer reserves WinUI title-bar height (removes ~32px top gap/click-through region) while honoringWindow.TitleBar.IsVisible; and Windows handler behavior forBorder/ContentViewproactively detaches the WinUIFrameworkElementfrom any existing parent panel before reparenting to prevent COM exceptions when reusing/moving the same platform view between containers. (PR #36442, PR #30311, PR #36209, PR #38301) - .NET MAUI (Windows): during app/window shutdown, handler property/command mapper invocations are suppressed once the window-scoped
MauiContextDI scope has been disposed (MauiContext.IsWindowScopeDisposedchecked byElementHandlerExtensions.CanInvokeMappers()), preventingObjectDisposedExceptioncrashes triggered by late focus updates (e.g.,Entryfocus changes causing style triggers to updateFontand resolveIFontManagerafterDisposeWindowScope()). (PR #34354) - .NET MAUI (Android) accessibility:
SemanticProperties.Descriptionis now always propagated to the native accessibility node’sContentDescription(includingEntry/EditText), while preserving synthesized accessibilityTextfor editable controls (ContentDescription=<description>,Text="<description>, <entry text>"), changing what UI automation tools (Appium/UIAutomator) observe. (PR #37276) - .NET MAUI (Android) platform behavior:
PlatformWrapperViewshadow invalidation is reduced to immediate-child invalidations to improve scrolling performance in shadowed containers;Pickertouch interaction allows long selected values to be horizontally drag-scrolled while keepingDefaultMovementMethod=null(read-only/no cursor) by forwarding appropriate drags toScrollingMovementMethodand suppressing unintended tap/long-press activation during drag; and Android status-bar icon contrast selection for edge-to-edge usescolorSurfacewhen Material 3 is enabled (instead ofcolorPrimary). (PR #37313, PR #37232, PR #38301) - .NET MAUI Essentials
Accelerometer.Defaultevents reverted to standard strong .NET events (no weak-event backing):Accelerometer.ReadingChangedandAccelerometer.ShakeDetectedrestore expected+=/-=semantics, but subscribers that do not unsubscribe may be kept alive and should explicitly detach to avoid app-lifetime retention/memory leaks. (PR #38096) - .NET MAUI Essentials permissions/screenshot/media picker changes: Android
Permissions.RequestAsync<T>()validatesMainThread.IsMainThreadbefore registering a pending request and removes the pending entry ifRequestPermissions(...)throws, preventing stale pending entries that can later break valid requests; AndroidScreenshot.Default.CaptureAsync()no longer deadlocks when called synchronously on the UI thread (PixelCopy callback runs on a dedicated backgroundHandlerThread, and off-main-thread completions can return failurenullrather than attempting unsafe view access); AndroidMediaPicker(Photo Picker viaPickVisualMedia*) now requires the currentActivityto be anAndroidX.Activity.ComponentActivity(e.g.,MauiAppCompatActivity) andPlatform.Init(Activity, Bundle)to be called inOnCreate(otherwisePick*AsyncthrowsInvalidOperationExceptionwith explicit guidance), and the underlying activity-result plumbing now registers one launcher perComponentActivity, persists/restores request ownership acrossOnSaveInstanceState, and cancels/completes pending requests onOnDestroy; iOS MediaPicker multi-select no longer intermittently fails withUIKitThreadAccessExceptionwhen picking 2+ items by capturingPHPickerResult.ItemProvideron the main thread before anyawait. (PR #37056, PR #37680, PR #38301, PR #38481) - .NET MAUI Essentials WebAuthenticator: on iOS, scene-based lifecycle callbacks (
SceneOpenUrlURL contexts andSceneContinueUserActivityuser activities withWebPageUrl) are forwarded into existing WebAuthenticator callback handling to preserve externally delivered callbacks for customIPlatformWebAuthenticatorCallbackimplementations (not a general deep-link replay mechanism). Additionally, WebAuthenticator is now unsupported on Windows (Windows implementation throwsPlatformNotSupportedException) and callback matching behavior is loosened (WebUtils.CanHandleCallbackno longer enforces port/path matching). (PR #38664, PR #38155) - .NET MAUI Maps (final state after rollbacks/reintroductions): Windows
MapHandler.Windowsuses the WinUI 3MapControl(Azure Maps via internal WebView2) with camera navigation viamap.setCamera(), supportsIMap.MoveToRegion(MapSpan),MapType,IsTrafficEnabled, scroll/zoom interaction, rendersPinsasMapIcon, and treatsElements(polylines/polygons/circles) as no-ops; docs should call out Windows limitations and that an Azure Maps key is required viabuilder.ConfigureEssentials(e => e.UseMapServiceToken("..."))/ApplicationModel.Platform.MapServiceToken. Windows handler lifecycle/teardown is adjusted so WinUIMapControl.Unloadedis not treated as permanent disposal (no longer mutatesLayers/ does not close internal WebView2) and cleanup occurs in a Windows-specificDisconnectHandler(FrameworkElement platformView)override, with re-entrant WebView2 readiness across handler lifetime. On iOS/Mac Catalyst,MapElementtracking is fixed so updating onePolyline.Geopathno longer breaks tracking for other elements, and removed/cleared elements reliably clearIMapElement.MapElementIdtonull. Compatibility Maps for Android are restored viaMicrosoft.Maui.Controls.Compatibility.Maps.Android(includingFormsMaps.Init(Activity, Bundle)andMapRenderer). (PR #38155, PR #37154, PR #37265) - .NET MAUI Resizetizer / asset build tooling: more reliable incremental packaging for
MauiFontandMauiSplashScreenby moving font item registration into an always-run_CollectMauiFontItemstarget and switchingProcessMauiFonts/ProcessMauiSplashScreensfrom stamp files to output-manifest tracking viamauifont.outputs/mauisplash.outputs(deleted intermediate outputs force regeneration); iOS/Mac CatalystUIAppFontsgeneration de-duplicates colliding font filenames (e.g., fromProjectReferences) and removes staleMauiInfo.plistwhen the lastMauiFontis removed. Also, resource-processing capabilities introduced in the net11 payload were removed: external backend extensibility viaResizetizerPlatformType/ResizetizerAfter*ProcessingTargetsand metadata-driven dark splash variants (MauiSplashScreenDarkFile/DarkColor/DarkTintColor) andMauiIconMonochromeFileare not supported. (PR #33919, PR #37393, PR #38155) - .NET MAUI build/source tooling: BindingSourceGen generates short, deterministic hint names for
spc.AddSource(...)(generated file name format changes from sanitized full source file path toBindingSourceGen-{stableHash}-{line}-{column}.g.cs, and generated binding method names use the same stable hash), reducingMAX_PATHrisk and changing how generated members appear in compiler-generated files. Shipped XAML/MSBuild tasks update to Mono.Cecil 0.11.6 to address a bug where build output PDB files could be corrupted. (PR #35986, PR #37783) - .NET MAUI repo/build baselines and templates: reverted from accidental
net11.0baseline back to .NET 10 defaults (including restoring “current vs previous” constants and platform SDK defaults), re-enabled iOS/Mac CatalystValidateXcodeVersionvalidation (default no longer forced false), and restored platform minimum versions in shared targets (Android back to 21.0; Mac Catalyst back to 15.0). Templates changed minimum platform versions in generated projects (notably Mac Catalyst 17.0 → 15.0 and Android 24.0 → 21.0 in several templates), removed thedotnet new maui--with-avaloniaoption, and updated MAUI Blazor templates soInteractivityLocationis no longer user-selectable (generated constantInteractiveGlobal) with a new boolean symbolEmptyalongside existingempty. (PR #38155) .github/skills/release-readiness: addsNew-ReleaseHandoff.ps1(documented inreferences/release-handoff.mdand referenced fromSKILL.md) to generate copy-ready, public-safe Preview and SR handoff/Loop-draft output (release-handoff.md+ normalizedrelease-handoff.json) from existing readiness JSON plus optional evidence JSON, requiring explicit"PublicEvidence": truefor public output, enforcing allow-listed public URLs/hosts, sanitizing private/credential-shaped content, and keeping missing facts as literalTBD. Preview installability validation also generates an isolated NuGet config withpackageSourceMapping, adds the prior-major public feed role for majors > 8, and marks installability outputPublicEvidence = true;Get-PreviewReadiness.ps1supports local net11 internal official-build health checks (public-safe output redacts internal coordinates; GitHub Actions always skips internal query). (PR #37408, PR #36915)- .NET MAUI official release pipeline/runbooks: official release workflow consolidated onto
eng/pipelines/ci-official-release.ymlwith NuGet.org publishing via1ES.PublishNuget@1(protected service connection), updated operator flow (“prepare → manual approval → publish packs → verify → publish manifests → verify”), new artifactsMauiPacksForNuGet/MauiManifestsForNuGet, and explicit recovery/verification behaviors (fail-fastdarc gather-dropfiltered to NuGet assets, validation of non-empty pack/manifest sets and duplicate/unexpected.nupkgs, and NuGet.org flat-container checks + retries/30-minute deadline). The same pipeline now supports non-workload NuGet.org releases (allowlisted fordotnet/android-libraries) withghOwner/ghRepoinputs, “shipping .nupkg only” gathering, include/exclude filters, pre-publish filtering of already-published ID/version pairs (including a second pass immediately before publishing),NuGetReleaseAuditartifact, dry runs (pushPackages: false), and workload-only recovery filters. (PR #36568, PR #37658)
Suggestions
Instructions for Copilot: Copilot should only fix suggestions with a checkmark and do not make any updates for unchecked suggestions.
Note
Suggestions are generated by AI and they should be reviewed by human before assigning it to Copilot. Please uncheck the ones you don't want Copilot to work on. Then assign this issue to Agent (GitHub Copilot).
- docs/user-interface/controls/entry.md:
- [Improvements] Update the sections that define/describe when the
Completedevent fires (the introductoryCompletedevent description and theCompletedevent section under “Create an Entry”) to clarify the Windows-specific behavior:Completedfires on an actual Enter key press sequence used to submit/finalize input, and does not fire when Enter is used only to confirm a Chinese/Japanese IME candidate on Windows. (PR #36577)
- [Improvements] Update the sections that define/describe when the
- docs/user-interface/controls/hybridwebview.md:
- [Correction Required] Update the trimming/Native AOT guidance to remove/replace the claim that “In .NET 11 and later, HybridWebView can be used with full trimming and Native AOT when JavaScript-to-.NET invocation is registered with source-generated JSON metadata” and the associated instructions that rely on the JsonSerializerContext overload producing a trim-safe/AOT-safe dispatcher. The page must reflect the current behavior: JS↔.NET invocation is reflection/dynamic System.Text.Json-based (annotated with RequiresUnreferencedCode/RequiresDynamicCode) and the previous trimming-friendly overloads/interfaces described here were removed/replaced, so following the current instructions can lead to warnings and/or non-functional JS→.NET invocation in trimmed/AOT builds. (Impacts: the two “Important” callouts near the top, and the “Invoke C# from JavaScript” + “Pass complex types from JavaScript to C#” sections.) (PR #38126, PR #38155, PR #37393)
- [Correction Required] Update the availability/registration behavior description to match the new runtime-feature gating: HybridWebViewHandler/IHybridWebViewTaskManager are registered only when RuntimeFeature.IsHybridWebViewSupported is enabled, and they are not registered under NativeAOT/TrimMode=Full. As written, the page implies that enabling trimming feature switches plus using the documented overload is sufficient; users can instead hit missing registration/feature-disabled behavior and be unable to complete the documented JS→.NET workflow. (Impacts: top-level “Important” about trimming/Native AOT availability and any section that implies JS→.NET invocation can be enabled for those configurations.) (PR #38126, PR #38155, PR #37393)
- [Improvements] Add/adjust the JS→.NET invocation requirements to reflect the new message source/frame validation on Windows (WebView2) and iOS (WKWebView): messages from JavaScript are ignored (with debug logging) unless the sending message Source/frame URL is an absolute URI under the configured AppOriginUri. Without this, users who load content in subframes/iframes or navigate to content not under AppOriginUri will find that window.HybridWebView.SendRawMessage and window.HybridWebView.InvokeDotNet appear to stop working with no actionable explanation from the doc. (Impacts: introduction claims about “arbitrary HTML/JS/CSS” + “Invoke C# from JavaScript” section and JS library usage notes.) (PR #38126, PR #38155, PR #37393)
- docs/deployment/trimming.md:
- [Improvements] Update the “Trimming incompatibilities”
HybridWebViewbullet and the “Trimming feature switches” entry forMauiHybridWebViewSupported(and its AppContext equivalentMicrosoft.Maui.RuntimeFeature.IsHybridWebViewSupported) to explicitly state thatHybridWebViewis not supported/available under Native AOT and/orTrimMode=Full, because the required HybridWebView services/handler are not registered in those configurations; clarify that the feature switch does not make HybridWebView usable in those configurations. (PR #38126, PR #38155, PR #37393)
- [Improvements] Update the “Trimming incompatibilities”
- docs/whats-new/dotnet-11.md:
- [Correction Required] In the “Controls > HybridWebView JS-to-.NET invocation” section, remove or rewrite the claims that HybridWebView can use a source-generated
JsonSerializerContextviaSetInvokeJavaScriptTarget<T>(T target, JsonSerializerContext jsonSerializerContext)to avoid reflection and be compatible with NativeAOT/full trimming, and that “the legacy overload remains available”. Update this section to reflect that the JS↔.NET invocation contract is reflection-based and annotated as requiring unreferenced/dynamic code, and that the previously described trimming-friendly overloads/interfaces are no longer the supported contract. (PR #38126, PR #38155, PR #37393) - [Improvements] In the “Controls > HybridWebView JS-to-.NET invocation” section, add the new operational requirements that affect whether JS-to-.NET messages are processed: (1) messages are ignored unless the message
Source/frame URL is an absolute URI under the configuredAppOriginUri(Windows WebView2 + iOS WKWebView), which can otherwise break JS-to-.NET calls; and (2) the JS-to-.NET infrastructure (HybridWebViewHandler/IHybridWebViewTaskManager) is only registered whenRuntimeFeature.IsHybridWebViewSupportedis enabled, and is not registered under NativeAOT/TrimMode=Full, so users must not expect HybridWebView JS↔.NET invocation to work in those builds. (PR #38126, PR #38155, PR #37393)
- [Correction Required] In the “Controls > HybridWebView JS-to-.NET invocation” section, remove or rewrite the claims that HybridWebView can use a source-generated
- docs/whats-new/dotnet-11.md:
- [Correction Required] Update the “Implicit XAML namespace declarations” section to remove/adjust the claim that implicit xmlns declarations are “enabled by default” and that root
xmlns/xmlns:xcan be omitted unconditionally. It must reflect that implicit XML namespace handling is gated by the[assembly: Microsoft.Maui.Controls.Xaml.Internals.AllowImplicitXmlnsDeclarationAttribute]; without it, XAML is treated as a full document and implicit default xmlns/prefix injection does not occur, so omitting the standard xmlns declarations can fail. (PR #38155) - [Correction Required] Update the “XAML Incremental Hot Reload” section to reflect that the XIHR flow described there has been removed/reverted. As written, users will expect XIHR to exist and may attempt to use the documented
EnableMauiIncrementalHotReloadopt-out property/workflow, which would no longer apply. The section must be revised so it no longer instructs users to rely on XIHR being enabled by default or controlled via that property under the current build targets/defaults. (PR #38155)
- [Correction Required] Update the “Implicit XAML namespace declarations” section to remove/adjust the claim that implicit xmlns declarations are “enabled by default” and that root
- docs/xaml/xamlc.md:
- [Improvements] Update the article’s statements about defaults to reflect that new .NET MAUI templates set
<MauiXamlInflator>SourceGen</MauiXamlInflator>by default, and clarify that the Debug=Runtime / non-Debug=XamlC defaults apply whenMauiXamlInflatoris not set (or when per-fileMauiXamlInflatorisDefault). This affects the introductory summary paragraph (“As of .NET 10, default inflation…”) and the “XAML Source Generation” section sentences implying SourceGen is not yet default (“will be enabled by default in the future”, “will become the future in new projects… soon”). (PR #38155)
- [Improvements] Update the article’s statements about defaults to reflect that new .NET MAUI templates set
- docs/xaml/fundamentals/get-started.md:
- [Correction Required] Update the implicit namespace guidance to reflect that implicit default xmlns/prefix injection is NOT unconditional: revise the earlier note in “Anatomy of a XAML file” and the later “Implicit namespace declarations” section so they no longer claim the compiler injects the standard namespaces by default in .NET 11. Instead, document that implicit handling is gated by the assembly-level
Microsoft.Maui.Controls.Xaml.Internals.AllowImplicitXmlnsDeclarationAttribute, and that without it users must keep explicitxmlnsdeclarations or XAML parsing/build will fail when they omit them. (PR #38155) - [Correction Required] In the “Implicit namespace declarations” subsection, replace/adjust the current opt-in instructions that use
DefineConstants(forMauiAllowImplicitXmlnsDeclaration) andEnablePreviewFeaturesso the doc matches the new gating mechanism (assembly attribute). As written, the doc implies those project settings enable implicit namespaces; after the change, users could apply these settings, omitxmlns, and still encounter XAML parsing treated as a full document with no implicit injection. (PR #38155) - [Improvements] Revise the “XAML Source Generation” section to remove/adjust the statement that the feature is strictly opt-in and align the described defaults with the fact that templates now generate projects with
<MauiXamlInflator>SourceGen</MauiXamlInflator>by default. Otherwise, users starting from current templates can be misled about what build behavior they are already using by default. (PR #38155)
- [Correction Required] Update the implicit namespace guidance to reflect that implicit default xmlns/prefix injection is NOT unconditional: revise the earlier note in “Anatomy of a XAML file” and the later “Implicit namespace declarations” section so they no longer claim the compiler injects the standard namespaces by default in .NET 11. Instead, document that implicit handling is gated by the assembly-level
- docs/xaml/namespaces/index.md:
- [Correction Required] Update the "Implicit namespace declarations" section (including the .NET 11 default-on description and the .NET 10 preview opt-in instructions) to reflect that implicit injection of the standard
xmlnsandxmlns:xdeclarations is gated by the assembly-levelMicrosoft.Maui.Controls.Xaml.Internals.AllowImplicitXmlnsDeclarationAttribute, and that without it XAML is parsed as a full document and the implicit default xmlns/prefix injection will not occur. Ensure the doc no longer implies that omission will work unconditionally. (PR #38155)
- [Correction Required] Update the "Implicit namespace declarations" section (including the .NET 11 default-on description and the .NET 10 preview opt-in instructions) to reflect that implicit injection of the standard
- docs/xaml/hot-reload.md:
- [Correction Required] Update the "Enable XAML Incremental Hot Reload" section to remove or replace the claims that XIHR exists/is enabled by default for Debug, that it enables XAML updates for dotnet watch, and that it can be opted out via the EnableMauiIncrementalHotReload MSBuild property; these statements must be aligned with the removal of the XIHR flow so users aren’t instructed to use a non-functional/non-existent mechanism. (PR #38155)
- docs/fundamentals/app-lifecycle.md:
- [Improvements] In the “iOS and Mac Catalyst” section (the lifecycle delegates table entry for
PerformActionForShortcutItem, and/or the surrounding guidance on registering handlers), add the requirement that everyPerformActionForShortcutItemhandler must call the provided completion callback exactly once, and that quick-action completion is aggregated across handlers (native completion is delayed until handlers return and completion callbacks are invoked; scene-delivered quick actions are handled through the same registrations). This prevents users from registering a handler that never completes and observing quick actions that appear to not work. (PR #38664)
- [Improvements] In the “iOS and Mac Catalyst” section (the lifecycle delegates table entry for
- docs/fundamentals/accessibility.md:
- [Correction Required] Update the "Semantic properties > Description" section warning bullet that says "Avoid setting the Description attached property on an Entry or Editor on Android. Doing so will stop Talkback actions functioning." to reflect the current Android behavior where SemanticProperties.Description is propagated to the native ContentDescription for Entry/Editor (and no longer implies TalkBack actions are broken by setting it). (PR #37276)
- docs/migration/native-essentials.md:
- [Improvements] Update the Android guidance in Initialize the platform (including the code sample that currently derives
MainActivity : Activity) to reflect that MediaPicker on Android requires the app’s current Activity to be anAndroidX.Activity.ComponentActivity(for example, an AppCompat-based Activity such asMauiAppCompatActivity) and thatPlatform.Init(this, savedInstanceState)must be called fromOnCreateof that Activity; otherwiseMediaPickerPick*Asynccan throwInvalidOperationExceptioneven if the rest of Essentials initialization appears correct. (PR #38301, PR #38481)
- [Improvements] Update the Android guidance in Initialize the platform (including the code sample that currently derives
- docs/platform-integration/communication/authentication.md:
- [Correction Required] Update all Windows-related guidance to reflect that WebAuthenticator is unsupported on Windows (Windows implementation throws PlatformNotSupportedException), so Windows setup steps and behavior descriptions are not applicable. Affected areas include: "Get started" platform list, the Windows setup section (Package.appxmanifest protocol registration), and the "Platform differences" Windows subsection (including the statement about using WebAuthenticationBroker). Without this change, users will follow the documented Windows workflow and encounter unavoidable runtime failure. (PR #38664, PR #38155)
- [Correction Required] Fix the Apple Sign In section statement that the non‑iOS web authentication flow "can also be used to enable Apple Sign In on your Android and Windows devices" to remove/adjust the Windows claim, because WebAuthenticator is unsupported on Windows and users would be misled into attempting a non-functional Windows sign-in flow. (PR #38664, PR #38155)
- docs/fundamentals/app-lifecycle.md:
- [Correction Required] Update the Windows > Handle AppInstance activation section to remove or revise the claim that .NET MAUI uses AppInstance activation lifecycle to support WebAuthenticator callbacks on Windows, since WebAuthenticator is now unsupported on Windows (throws PlatformNotSupportedException). This section’s WebAuthenticator-specific guidance about redirecting protocol activations must be corrected to prevent users from attempting a non-working Windows WebAuthenticator workflow. (PR #38155)
- docs/user-interface/controls/map.md:
- [Correction Required] Fix the Windows support guidance in the introductory "Important" callout(s) under the opening description (the section that currently says the Map control isn't supported on Windows and points to CommunityToolkit.Maui.Maps). Update/remove that statement so it no longer claims Windows is unsupported, and ensure it aligns with the later Windows guidance that the built-in Map uses WinUI 3 MapControl backed by Azure Maps and requires an Azure Maps subscription key. (PR #38155, PR #37154, PR #37265)
- docs/whats-new/dotnet-11.md:
- [Correction Required] Update the "Platform features" section entries "MonochromeFile for Android adaptive icons" and "Themed splash screens" to remove or revise the claims/examples that
MauiIconsupportsMonochromeFileandMauiSplashScreensupportsDarkFile/DarkColor/DarkTintColor, because these metadata-driven variants are not supported after the tooling change; otherwise users will configure these attributes and not get the documented results. (PR #33919, PR #37393, PR #38155)
- [Correction Required] Update the "Platform features" section entries "MonochromeFile for Android adaptive icons" and "Themed splash screens" to remove or revise the claims/examples that
- docs/whats-new/dotnet-10.md:
- [Correction Required] Update the ".NET for Android" section "Recommended minimum supported Android API" to reflect the reverted template defaults (Android SupportedOSPlatformVersion now defaults back to 21 rather than 24). Without this change, users will form an incorrect understanding of the default minimum Android API used by generated .NET MAUI/.NET for Android projects. (PR #38155)
- docs/mac-catalyst/cli.md:
- [Correction Required] In the main tutorial steps (the build/run section after creating the project), update the
dotnet build -t:Run -f net8.0-maccatalystcommand to use the .NET 10 Mac Catalyst TFM generated by current .NET MAUI templates (for example,net10.0-maccatalyst), so users can successfully build and run the newly created app. (PR #38155)
- [Correction Required] In the main tutorial steps (the build/run section after creating the project), update the
📚 To learn more about agentic content maintenance workflow, visit Agentic workflow for Learn content maintenance. Sign in using Learn Profile to access the content on this link.
💬 Share your feedback on the Learn Content Maintenance Agentic Workflow here.
Activity