Prism Uno playground (e2e)
Single-project Uno sample: regions (NavigationView + nested ContentControl), dialogs, modularity (Playground.Module), DryIoc, ILoadableShell / splash, and InvokeCommandAction on Home.
The pages preserve their content's natural dimensions and allow horizontal and vertical scrolling when the available space is smaller. In portrait and landscape, expand and collapse the navigation pane, then scroll the page to reach its complete button labels and content. Existing page maximum widths, font sizes, and binding scenarios stay the same.
Build from repo root
Prism packages are project references; builds compile src/Uno as needed.
Skia / workloads: This sample omits SkiaRenderer in UnoFeatures so dotnet workload restore succeeds on Android/iOS heads (Uno ReplaceUnoRuntime / RuntimeAssetsSelectorTask issue when Skia is forced for those TFMs).
dotnet build (CLI-friendly TFMs)
dotnet build .\e2e\Uno\HelloWorld\HelloWorld.csproj -f net10.0-desktop
dotnet build .\e2e\Uno\HelloWorld\HelloWorld.csproj -f net10.0-browserwasm
WinUI (net10.0-windows10.0.*)
Uno blocks dotnet build for WinUI class libraries that contain XAML (error UNOB0008). Build the Windows TFM with Visual Studio or msbuild (same as CI for Prism.Uno):
msbuild .\e2e\Uno\HelloWorld\HelloWorld.csproj -restore -p:TargetFramework=net10.0-windows10.0.26100
Full solution file
HelloWorld.slnx includes Prism library projects. Do not pass a single -f to the whole solution: that forces every project (including Prism.Core) onto one TFM. Prefer building HelloWorld.csproj per TFM as above.
Getting started (Uno)
https://aka.platform.uno/get-started
https://aka.platform.uno/using-uno-sdk
Local NativeAOT binding validation
Open NativeAOT binding lab from the existing navigation menu. This uses the
app's real container, named region navigation, ordinary {Binding} paths, and
an independent closed generic INPC model base (NotifyingContext<string>) with
inherited title/visibility properties.
- Run binding checks must report
PASS: 15 rendered binding checks. It reads rendered title/visibility and collection-template controls after initial binding, inherited property notifications, context replacement/old-model detachment, null/restore, and collection item update/add/remove. - Choose Navigate to named detail. A new lab page must appear and its status
must identify
BindingLabDetail. Run the checks there, then Back. The journal must return to the original lab with its restored context. The view-model accepts reuse only for its original named route, so detail and root retain independent contexts. Repeat the navigation. - Manual buttons allow each mutation to be inspected independently. Replace / restore recovers after setting the context to null. The existing Home, Region, Dialog, and Module pages remain accessible.
PrismNativeAotValidation=true opts the Release Android/iOS app project into
PublishAot=true and UseInterpreter=false; ordinary builds are unchanged.
Validation selects the actual Prism.Container.Microsoft adapter via
CreateContainerExtension on the container-neutral PrismApplicationBase. The
validation build references Prism.Uno directly and does not reference the DryIoc
adapter. Central package configuration pins Microsoft and Abstractions, including
its shared analyzer in referenced source libraries, to published 10.0.94-pre.
Restore from a configured Prism package feed containing this version. No version
override or local container build is needed for this baseline. The optional
PrismNativeAotContainerVersion property selects matching real local packages
when testing further unpublished container changes. Do not substitute a container
shim. Resolve package/framework compatibility before native publishing. Do
not pass PublishAot globally, since that propagates to referenced libraries. NativeAOT qualification requires a supported SDK/platform/RID and a
verified NativeAOT-compatible real container configuration, followed by a local
publish and device run. Record exact versions and every trimming/AOT warning.
Cloud source/XML checks are not a NativeAOT or device pass. No mobile CI jobs or
workflow changes are included.
For a supported Uno iOS NativeAOT toolchain:
dotnet publish e2e/Uno/HelloWorld/HelloWorld.csproj \
-c Release -f net10.0-ios -r ios-arm64 \
-p:PrismNativeAotValidation=true
Uno 6.6 NativeAOT guidance
includes .NET 10 Android and iOS. Android needs NDK r27 or newer and emits the
experimental XA1040 warning. For Android, use the same command with
-f net10.0-android -r android-arm64 and inspect the warning and device results.
Never count an ordinary Android AOT build as NativeAOT validation.
For optional unpublished source-package preparation, follow the
real local container package commands.
Use both projects' normal supported TFMs, then add
-p:RestoreAdditionalProjectSources="$PRISM_CONTAINER_FEED" to the publish
command together with -p:PrismNativeAotContainerVersion="$PRISM_CONTAINER_VERSION". The net10-only package used for cloud generator/core unit tests does
not establish a complete multi-target mobile restore or native execution pass.
The nested action checks bind Context.ActionButton.Text, .Icon, and .Command
and computed HasActionButton/HasTitle flags. They inspect actual controls after
nested notifications, replacement/detachment, null and restoration, then invoke
the command obtained from the bound control and check the rendered title. The
nested action derives from BindableBase without an application-side attribute;
the context still tests the independent-INPC path. Generated property preservation
alone is not proof that Uno generated accessors for every independent INPC type.
The publish commands deliberately use the physical-device ios-arm64 RID.
Do not infer simulator NativeAOT support from general platform documentation;
check the exact installed SDK's support before selecting another RID. An earlier
native publish, a later non-native simulator login, or an existing generated
metadata file cannot qualify the current source changes. Capture a fresh native
publish and these rendered checks on that exact resulting binary.
CLI driven physical-device checks
In a Release NativeAOT validation build, set PRISM_NATIVEAOT_AUTORUN=1 when
launching the existing app. The app opens the binding lab, runs its 15 rendered
control assertions, navigates through the buttons' actual bound commands to
named detail, runs the assertions there, and returns through Back twice. Console
markers report each result and confirm that Back restores the original root
view model, context and rendered state. This opt-in does not replace manual
portrait/landscape, scrolling, accessibility or touch interaction checks.
On Android, launch the existing main activity with the boolean Intent extra
prism-nativeaot-autorun=true; it sets the same opt-in before UI initialization.