Skip to content

[AI-Suggested] Content update request from Product Release signal: maui 10.0.110 #3560

Open

Description

@learn-build-service-prod

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:

Source Signal Summary

Details
  • .NET MAUI Controls: SwipeItemView.Command (SwipeView) now uses WeakCommandSubscription instead of a strong ICommand.CanExecuteChanged event handler, preventing SwipeItemView (and its visual subtree) from being kept alive when bound to long-lived commands that raise CanExecuteChanged via strong events (e.g., custom ICommand / CommunityToolkit RelayCommand); public API is unchanged and IsEnabled/CanExecute behavior remains the same, but the command subscription lifetime no longer causes a memory leak when views are discarded/unloaded. ListView.RefreshCommand similarly now uses WeakCommandSubscription so long-lived/custom ICommand implementations don’t prevent ListView (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.ItemsSource uses a WeakNotifyCollectionChangedProxy (and IndicatorView.~IndicatorView() unsubscribes) so IndicatorView can be collected even when bound to a long-lived ObservableCollection; TableView/TableView.Root avoids retaining TableView/TableRoot via strong event subscriptions when TableRoot (or TableSection) is shared/long-lived; GeometryGroup uses weak collection/property subscriptions and is null-safe when Children is null or contains null entries; FormattedString.Spans uses per-occurrence weak subscriptions so a shared Span instance doesn’t keep discarded FormattedStrings alive; GradientBrush unsubscribes GradientStop.PropertyChanged on GradientStops.Clear()/Reset so cleared stops don’t remain subscribed; XAML binding diagnostics BindingDiagnostics.BindingFailed is now backed by WeakEventManager (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.BackgroundColor changes driven by AppThemeBinding now correctly propagate to the native control because BackgroundColorProperty raises a handler update for ISwipeItemMenuItem.Background and the SwipeItemMenuItemHandler property mapper is keyed to ISwipeItemMenuItem.Background (not IView.Background); additionally on iOS and Windows, updating the swipe item background now also triggers a refresh of ITextStyle.TextColor. On Android, revealed swipe-item commands now execute when activated via accessibility services (TalkBack) by handling ACTION_CLICK and applying existing SwipeBehaviorOnInvoked behavior; and Android swipe-item layout now measures swipe item height with MeasureSpecMode.AtMost to improve vertical centering/avoid over-constraining height. On Windows, placing a SwipeView (WinUI SwipeControl) directly inside a Border no longer causes a native crash, but the SwipeView content will not have its corners clipped to the Border shape (stroke/path still renders). (PR #36271, PR #37143, PR #38301, PR #36714)
  • CarouselView/CollectionView behavior fixes across platforms:
  • CarouselView consistently honors IsSwipeEnabled and IsBounceEnabled (iOS/Mac Catalyst now applies settings to the embedded orthogonal UIScrollView created by UICollectionViewCompositionalLayout; Android now blocks scrolling even when touch dispatch goes directly to OnTouchEvent).
  • iOS/Mac Catalyst CarouselView re-synchronizes Position/CurrentItem when the handler re-attaches (treats Position as 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 set CurrentItem after an off-screen/detached CarouselView has its ItemsSource replaced (avoids restoring stale Position).
  • Android CarouselView handles INotifyCollectionChanged.Replace without resetting to position 0; in Loop=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/ScrollToItem near 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 EmptyView is 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 GridItemsLayout is 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 plus InterSectionSpacing.
  • iOS Items2 CollectionView now supports RefreshView pull-to-refresh even when the EmptyView is displayed (keeps empty-view host inside UICollectionView so pan gestures reach the scroll view; preserves RTL/LTR by separately applying FlowDirection and counter-transforming the empty-view host).
  • Android grouped CollectionView item removal no longer intermittently crashes (ArgumentOutOfRangeException) due to adapter null/position range checks in SpacingItemDecoration. (PR #36428, PR #36287, PR #36681, PR #36243, PR #36431, PR #36127, PR #36561, PR #38296, PR #38482)
  • .NET MAUI ScrollView on iOS/Mac Catalyst changed scrolling/offset semantics to account for safe area/platform content insets: ScrollX/ScrollY and ScrolledEventArgs now use inset-aware “content coordinates” (resting position reports 0 instead of -AdjustedContentInset.Top); ScrollToAsync / IScrollView.RequestScrollTo is translated/clamped against UIScrollView.AdjustedContentInset so scrolling to start/end and element-target scrolling land in the visible viewport; deferred ScrollToAsync requests 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 the ScrollView lifecycle ends (handler disconnected/removed/reparented) or the target becomes orphaned because ScrollView.Content was replaced/removed; and iOS/Mac Catalyst ScrollViewHandler.PlatformArrange(Rect) now preserves the current UIScrollView.ContentOffset across 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=None when a NavigationPage or Shell navigation bar is hidden at runtime (clears stale AppBarLayout padding); RTL mirroring in PlatformArrangeHandler now 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 Button on iOS/Mac Catalyst fixes/changes: correctly refreshes CharacterSpacing formatting when Text changes (including TextTransform/ContentLayout scenarios) and ensures UIButton.TitleLabel.Text is synced; correctly updates TextColor (including resetting to null) when CharacterSpacing is set by updating/removing attributed-title ForegroundColor; on iOS/Mac Catalyst, Button.ContentLayout (Left/Right image positions with spacing) now uses EffectiveFlowDirection so RTL layouts preserve expected image/text spacing; and iOS UpdateBackground no longer forces BackgroundColor = UIColor.Clear when background paint becomes null/empty during initial handler connection while UIButton.Window is still null (preserves native BackgroundColor set by custom UIButton subclasses until attached, while still clearing gradients consistently). (PR #36326, PR #36699, PR #38339, PR #38301)
  • .NET MAUI Entry cross-platform behavior fixes: Windows no longer raises Entry.Completed when the user presses Enter to confirm a Chinese/Japanese IME candidate (Completed fires only on a real Enter KeyDown + KeyUp sequence); iOS/Mac Catalyst clear button tinting matches TextColor at full opacity when ClearButtonVisibility is enabled; iOS and Windows now respect Entry.IsPassword even when Entry.Keyboard is set to Keyboard.Password (developers can set IsPassword=false, including runtime toggles on Windows, without it being overwritten); Android Entry with Keyboard="Numeric" now accepts the OS-locale decimal separator by fixing how password-variation flags are cleared from Android InputType. (PR #36577, PR #36472, PR #36677, PR #38483)
  • .NET MAUI Label.FormattedText changes/fixes: on iOS/Mac Catalyst, span tap hit-testing now uses line metrics aligned with CoreText on iOS 16+ (NSLayoutManager.UsesFontLeading = false) and prefers MAUI finalSize over UILabel.Bounds; on Windows, updating/replacing the FormattedString clears any previously applied native TextBlock.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 to FormattedText/spans (uses EffectiveFlowDirection, sets NSParagraphStyle.BaseWritingDirection, mirrors TextAlignment.Start/End, and rebuilds formatted text on flow-direction changes). (PR #36564, PR #36608, PR #36828, PR #36277)
  • .NET MAUI Image/ImageButton handler background behavior: on iOS/Mac Catalyst, setting BackgroundColor/Background back to null now removes the native background layer and clears native backgrounds (previous background no longer “sticks”), explicitly handles ImageSourcePaint backgrounds via async image-source loading, and re-applies IView.Opacity after background/container transitions to avoid compounded/incorrect opacity; on Windows, changing BackgroundColor/Background via binding no longer crashes with a COMException after navigating away because container creation is deferred until PlatformView.IsLoaded and background is applied on reload (Loaded event). (PR #36427, PR #36747)
  • .NET MAUI FlexLayout fixes: 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., Label with LineBreakMode=WordWrap) rendering with truncated/cut-off text; and on Windows/WinUI, FlexLayout no longer throws NullReferenceException during late layout/measure after being detached/recycled in virtualized templates (Layout(...) no-ops when detached, measure returns Size.Zero, flex frame returns Rect.Zero). (PR #36416, PR #36946)
  • .NET MAUI Shell behavior/styling fixes: SearchHandler.ShowsResults runtime updates are now honored across Android, iOS/Mac Catalyst, and Windows (results UI and population update immediately when toggled); Shell flyout item label TextColor on Android is applied at the lowest SetterSpecificity so user styles override it (implicit Style TargetType="Label" and explicit/class FlyoutItemLabelStyle); on Windows, SearchHandler now correctly applies FontFamily, FontSize, and FontAttributes to the native AutoSuggestBox; on Windows, runtime add/remove of ShellContent now correctly propagates ShellContent.Title changes to parent menu titles; ContentPage.HideSoftInputOnTapped (Android/iOS) is now evaluated per currently focused view’s enclosing ContentPage, fixing a Shell navigation edge case where it could get stuck enabled globally; and on Windows, calling Shell.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 HtmlWebViewSource records proper back/forward history entries so GoBack()/GoForward() work after loading HTML (iOS 15+/Mac Catalyst 15+ uses WKWebView.LoadSimulatedRequest; older versions fall back to LoadHtmlString with base URL preserved). On Windows (WebView2), https://appdir/ detection/serving is tightened (must be parsed https absolute URI with no userinfo and host exactly appdir; navigation to non-appdir clears mapping) and the folder mapping uses CoreWebView2HostResourceAccessKind.DenyCors, which blocks cross-origin fetch/XHR to https://appdir/... from LoadHtml/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.MinimumFontSize and MinimumLogicalFontSize to 1 (instead of default 8), preventing silent clamping of CSS font-size values 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.__BlazorStarting guard), window.__BlazorStarted is set only after Blazor.start() resolves, JS-to-native messaging uses a captured window.__nativePort and native-to-JS dispatch routes PostWebMessage from window message to window.external.__callback while ignoring non-native messages (event.source === null); and external-link handling now creates a sanitized Intent for intent:// or android-app:// URIs (forces implicit + browsable, clears component/selector, masks flags to an allowlist) before StartActivity. (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 configured AppOriginUri (Windows WebView2 + iOS WKWebView), and the JS-to-.NET invocation setup and registration behavior changed so HybridWebViewHandler/IHybridWebViewTaskManager are registered only when RuntimeFeature.IsHybridWebViewSupported is enabled (not registered under NativeAOT/TrimMode=Full); the JS↔.NET invocation contract is reflection-based with dynamic System.Text.Json annotated [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 to Type.GetProperty(target) and rejecting standalone {(Type.Property)} with a diagnostic instructing users to qualify with a target; validates identifiers inside interpolated strings and reports MAUIX2009 (MemberNotFound) instead of cryptic C# compiler errors; adds MAUIX2017 (LambdaMethodGroupReference) for lambda bodies that are method groups (suggests OnClicked(s, e)); adds MAUIX2015/MAUIX2016 for x:Code placement and x:Class requirements; 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 reporting MAUIX2018 StructIntermediateNotSettable (warning) (renumbered from MAUIX2017). (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 for x:Shared usage (previously XC0129), 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 for MauiXamlInflator (Debug → Runtime, non-Debug → XamlC), while templates now generate projects with <MauiXamlInflator>SourceGen</MauiXamlInflator> by default and allow per-file override via MauiXaml item metadata Inflator. (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 UIToolbar Done button (44-pt height unchanged). A default-off AppContext switch Microsoft.Maui.Platform.iOS.UseLegacyDoneAccessory opts 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 (UIApplicationSceneManifest in Info.plist, SceneDelegate derived from MauiUISceneDelegate, configuration name __MAUI_DEFAULT_SCENE_CONFIGURATION__, still single-window via UIApplicationSupportsMultipleScenes=false), raise default Mac Catalyst SupportedOSPlatformVersion to 17.0 (iOS remains 15.0), and introduce a scene quick-action API MauiUISceneDelegate.PerformAction(UIWindowScene, UIApplicationShortcutItem, Action<bool>). In runtime lifecycle events, PerformActionForShortcutItem handling 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 NavigationPage large-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 wrapped ScrollView, ListView (obsolete), CollectionView/ItemsView, TableView, and WebView. (PR #36511)
  • .NET MAUI Controls on iOS/Mac Catalyst: DatePicker.Background and TimePicker.Background now clear the native background when set to null/empty paint at runtime (previously could remain visible). Switch.ThumbColor now correctly reverts to platform/theme default when set back to null (iOS sets ThumbTintColor=null; Android rebuilds default theme ThumbTintList; Windows removes overridden knob-fill resources and refreshes theme resources). (PR #36934, PR #36750)
  • .NET MAUI on Windows (UI/controls): Border.StrokeLineCap now also updates WinUI Path.StrokeDashCap so dashed Border strokes respect line cap settings; LayoutPanel preserves a non-null Background brush even when InputTransparent=true (background remains visible); modal navigation in full-screen no longer reserves WinUI title-bar height (removes ~32px top gap/click-through region) while honoring Window.TitleBar.IsVisible; and Windows handler behavior for Border/ContentView proactively detaches the WinUI FrameworkElement from 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 MauiContext DI scope has been disposed (MauiContext.IsWindowScopeDisposed checked by ElementHandlerExtensions.CanInvokeMappers()), preventing ObjectDisposedException crashes triggered by late focus updates (e.g., Entry focus changes causing style triggers to update Font and resolve IFontManager after DisposeWindowScope()). (PR #34354)
  • .NET MAUI (Android) accessibility: SemanticProperties.Description is now always propagated to the native accessibility node’s ContentDescription (including Entry/EditText), while preserving synthesized accessibility Text for editable controls (ContentDescription=<description>, Text="<description>, <entry text>"), changing what UI automation tools (Appium/UIAutomator) observe. (PR #37276)
  • .NET MAUI (Android) platform behavior: PlatformWrapperView shadow invalidation is reduced to immediate-child invalidations to improve scrolling performance in shadowed containers; Picker touch interaction allows long selected values to be horizontally drag-scrolled while keeping DefaultMovementMethod=null (read-only/no cursor) by forwarding appropriate drags to ScrollingMovementMethod and suppressing unintended tap/long-press activation during drag; and Android status-bar icon contrast selection for edge-to-edge uses colorSurface when Material 3 is enabled (instead of colorPrimary). (PR #37313, PR #37232, PR #38301)
  • .NET MAUI Essentials Accelerometer.Default events reverted to standard strong .NET events (no weak-event backing): Accelerometer.ReadingChanged and Accelerometer.ShakeDetected restore 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>() validates MainThread.IsMainThread before registering a pending request and removes the pending entry if RequestPermissions(...) throws, preventing stale pending entries that can later break valid requests; Android Screenshot.Default.CaptureAsync() no longer deadlocks when called synchronously on the UI thread (PixelCopy callback runs on a dedicated background HandlerThread, and off-main-thread completions can return failure null rather than attempting unsafe view access); Android MediaPicker (Photo Picker via PickVisualMedia*) now requires the current Activity to be an AndroidX.Activity.ComponentActivity (e.g., MauiAppCompatActivity) and Platform.Init(Activity, Bundle) to be called in OnCreate (otherwise Pick*Async throws InvalidOperationException with explicit guidance), and the underlying activity-result plumbing now registers one launcher per ComponentActivity, persists/restores request ownership across OnSaveInstanceState, and cancels/completes pending requests on OnDestroy; iOS MediaPicker multi-select no longer intermittently fails with UIKitThreadAccessException when picking 2+ items by capturing PHPickerResult.ItemProvider on the main thread before any await. (PR #37056, PR #37680, PR #38301, PR #38481)
  • .NET MAUI Essentials WebAuthenticator: on iOS, scene-based lifecycle callbacks (SceneOpenUrl URL contexts and SceneContinueUserActivity user activities with WebPageUrl) are forwarded into existing WebAuthenticator callback handling to preserve externally delivered callbacks for custom IPlatformWebAuthenticatorCallback implementations (not a general deep-link replay mechanism). Additionally, WebAuthenticator is now unsupported on Windows (Windows implementation throws PlatformNotSupportedException) and callback matching behavior is loosened (WebUtils.CanHandleCallback no longer enforces port/path matching). (PR #38664, PR #38155)
  • .NET MAUI Maps (final state after rollbacks/reintroductions): Windows MapHandler.Windows uses the WinUI 3 MapControl (Azure Maps via internal WebView2) with camera navigation via map.setCamera(), supports IMap.MoveToRegion(MapSpan), MapType, IsTrafficEnabled, scroll/zoom interaction, renders Pins as MapIcon, and treats Elements (polylines/polygons/circles) as no-ops; docs should call out Windows limitations and that an Azure Maps key is required via builder.ConfigureEssentials(e => e.UseMapServiceToken("...")) / ApplicationModel.Platform.MapServiceToken. Windows handler lifecycle/teardown is adjusted so WinUI MapControl.Unloaded is not treated as permanent disposal (no longer mutates Layers / does not close internal WebView2) and cleanup occurs in a Windows-specific DisconnectHandler(FrameworkElement platformView) override, with re-entrant WebView2 readiness across handler lifetime. On iOS/Mac Catalyst, MapElement tracking is fixed so updating one Polyline.Geopath no longer breaks tracking for other elements, and removed/cleared elements reliably clear IMapElement.MapElementId to null. Compatibility Maps for Android are restored via Microsoft.Maui.Controls.Compatibility.Maps.Android (including FormsMaps.Init(Activity, Bundle) and MapRenderer). (PR #38155, PR #37154, PR #37265)
  • .NET MAUI Resizetizer / asset build tooling: more reliable incremental packaging for MauiFont and MauiSplashScreen by moving font item registration into an always-run _CollectMauiFontItems target and switching ProcessMauiFonts/ProcessMauiSplashScreens from stamp files to output-manifest tracking via mauifont.outputs/mauisplash.outputs (deleted intermediate outputs force regeneration); iOS/Mac Catalyst UIAppFonts generation de-duplicates colliding font filenames (e.g., from ProjectReferences) and removes stale MauiInfo.plist when the last MauiFont is removed. Also, resource-processing capabilities introduced in the net11 payload were removed: external backend extensibility via ResizetizerPlatformType/ResizetizerAfter*ProcessingTargets and metadata-driven dark splash variants (MauiSplashScreen DarkFile/DarkColor/DarkTintColor) and MauiIcon MonochromeFile are 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 to BindingSourceGen-{stableHash}-{line}-{column}.g.cs, and generated binding method names use the same stable hash), reducing MAX_PATH risk 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.0 baseline back to .NET 10 defaults (including restoring “current vs previous” constants and platform SDK defaults), re-enabled iOS/Mac Catalyst ValidateXcodeVersion validation (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 the dotnet new maui --with-avalonia option, and updated MAUI Blazor templates so InteractivityLocation is no longer user-selectable (generated constant InteractiveGlobal) with a new boolean symbol Empty alongside existing empty. (PR #38155)
  • .github/skills/release-readiness: adds New-ReleaseHandoff.ps1 (documented in references/release-handoff.md and referenced from SKILL.md) to generate copy-ready, public-safe Preview and SR handoff/Loop-draft output (release-handoff.md + normalized release-handoff.json) from existing readiness JSON plus optional evidence JSON, requiring explicit "PublicEvidence": true for public output, enforcing allow-listed public URLs/hosts, sanitizing private/credential-shaped content, and keeping missing facts as literal TBD. Preview installability validation also generates an isolated NuGet config with packageSourceMapping, adds the prior-major public feed role for majors > 8, and marks installability output PublicEvidence = true; Get-PreviewReadiness.ps1 supports 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.yml with NuGet.org publishing via 1ES.PublishNuget@1 (protected service connection), updated operator flow (“prepare → manual approval → publish packs → verify → publish manifests → verify”), new artifacts MauiPacksForNuGet / MauiManifestsForNuGet, and explicit recovery/verification behaviors (fail-fast darc gather-drop filtered 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 for dotnet/android-libraries) with ghOwner/ghRepo inputs, “shipping .nupkg only” gathering, include/exclude filters, pre-publish filtering of already-published ID/version pairs (including a second pass immediately before publishing), NuGetReleaseAudit artifact, 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 Completed event fires (the introductory Completed event description and the Completed event section under “Create an Entry”) to clarify the Windows-specific behavior: Completed fires 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)
  • 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” HybridWebView bullet and the “Trimming feature switches” entry for MauiHybridWebViewSupported (and its AppContext equivalent Microsoft.Maui.RuntimeFeature.IsHybridWebViewSupported) to explicitly state that HybridWebView is not supported/available under Native AOT and/or TrimMode=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)
  • 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 JsonSerializerContext via SetInvokeJavaScriptTarget<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 configured AppOriginUri (Windows WebView2 + iOS WKWebView), which can otherwise break JS-to-.NET calls; and (2) the JS-to-.NET infrastructure (HybridWebViewHandler/IHybridWebViewTaskManager) is only registered when RuntimeFeature.IsHybridWebViewSupported is 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)
  • 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:x can 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 EnableMauiIncrementalHotReload opt-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)
  • 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 when MauiXamlInflator is not set (or when per-file MauiXaml Inflator is Default). 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)
  • 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 explicit xmlns declarations 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 (for MauiAllowImplicitXmlnsDeclaration) and EnablePreviewFeatures so 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, omit xmlns, 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)
  • 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 xmlns and xmlns:x declarations is gated by the assembly-level Microsoft.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)
  • 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 every PerformActionForShortcutItem handler 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)
  • 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 an AndroidX.Activity.ComponentActivity (for example, an AppCompat-based Activity such as MauiAppCompatActivity) and that Platform.Init(this, savedInstanceState) must be called from OnCreate of that Activity; otherwise MediaPicker Pick*Async can throw InvalidOperationException even if the rest of Essentials initialization appears correct. (PR #38301, PR #38481)
  • 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 MauiIcon supports MonochromeFile and MauiSplashScreen supports DarkFile/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)
  • 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-maccatalyst command 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)

📚 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.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions