Uno Islands let you embed Uno Platform controls inside an existing WPF application so you can migrate one screen at a time without a big-bang rewrite. The WPF app keeps shipping. New work happens in cross-platform Uno Platform pages. When enough of the app has moved, the WPF shell becomes a thin wrapper, and removing it is a small final step instead of a 9-month rewrite.
Why Incremental Beats Big-Bang
The most common reason WPF migrations stall is scope. A team commits to a 6 to 12 month rewrite, the new platform takes longer than expected, leadership loses patience around month 7, the project is paused, and the team is left maintaining two codebases.
Incremental migration breaks the dependency between "framework decision" and "ship to users":
- The WPF app keeps shipping. Users see continuous improvement.
- Each migrated screen ships independently. Risk is bounded per screen.
- The framework decision is validated on production screens, not on a pilot in a sandbox.
- If a target platform turns out wrong, you have lost a few screens of work, not a 9-month commitment.
What Uno Islands Is
Uno Islands is a hosting mechanism that lets you place Uno Platform XAML pages inside a WPF (or WinForms) host control. The Uno Platform page renders inside the WPF window, communicates with the surrounding WPF app via standard .NET interop, and is built once for cross-platform reuse on macOS, Linux, iOS, Android, and the browser.
+---------------------------------------------+
| Existing WPF Application |
| +---------------------------------------+ |
| | WPF Window | |
| | +---------------+ +---------------+ | |
| | | Legacy WPF | | Uno Island: | | |
| | | UserControl | | Uno Page | | |
| | | (existing) | | (cross-plat) | | |
| | +---------------+ +---------------+ | |
| +---------------------------------------+ |
+---------------------------------------------+The migrated Uno Platform page is independently runnable on every Uno target platform. The WPF host is just one of those targets: the one that lets the existing app keep shipping.
When Uno Islands Fits
Use Uno Islands when:
- The WPF app is in active production and you cannot pause shipping for a rewrite
- The team wants to validate Uno Platform on real screens before committing the full migration
- The migration will happen over multiple quarters or longer
- Some screens are too risky or complex to migrate first; you want to start with the simple ones
- Different teams own different screens and can migrate at their own pace
Skip Uno Islands when:
- The app is small enough to rewrite end-to-end in a few weeks
- The platform-specific code is the long pole, in which case the WPF host is helping you avoid the work you actually need to do
- The goal is to ship to a non-Windows platform tomorrow, not over a quarter
Embedding the First Uno Platform Page
Refer to the Uno Islands documentation for the exact NuGet packages, project file changes, and host control configuration in your current Uno Platform version.
Create a new Uno Platform class library in your existing WPF solution. The library holds cross-platform pages reused by the WPF host and (eventually) by macOS, Linux, WASM, and mobile heads.
dotnet new unoapp -n MyApp.UnoPagesAdd the Uno Platform Islands host package to the WPF project. Place the host control where the migrated page should appear:
<Window x:Class="LegacyApp.MainWindow"
xmlns:islands="clr-namespace:Uno.Islands;assembly=Uno.Islands">
<DockPanel>
<Menu DockPanel.Dock="Top"> ... </Menu>
<islands:UnoIslandHost x:Name="SettingsHost" />
</DockPanel>
</Window>public MainWindow()
{
InitializeComponent();
SettingsHost.Source = typeof(MyApp.UnoPages.SettingsPage);
}Element and namespace names may differ in the current Uno Platform release; verify against the Uno Islands documentation for your version.
Start with a low-risk screen that exercises common patterns: a settings page, an about screen, a simple form. Validate the page renders correctly inside the WPF host.
The Uno Platform page can be backed by ViewModels that the WPF host injects. Standard .NET DI works across the boundary:
- The Uno page exposes a
ViewModelproperty; the WPF host sets it on activation. - The Uno page raises events the WPF host subscribes to (e.g.,
Saved,Cancelled). - The Uno page consumes the same domain services the WPF host uses, via a shared service provider.
The migrated Uno page ships inside the WPF MSI/MSIX like any other update. Users see one new page; they do not see "you migrated us." The risk is bounded to that one page.
Each subsequent screen follows the same pattern. The WPF Windows that wrap migrated pages become thinner over time. When most user-facing screens have moved, the final step is replacing the WPF shell with an Uno Platform shell, at which point the app is fully cross-platform.
What You Do Not Get from Islands
Uno Islands is a host pattern, not a magic bridge. Things that still need real work:
- Platform-specific code. P/Invoke, Windows-only APIs, screen capture, hotkey registration, and shell integration stay Windows-only. Cross-platform abstractions are needed later.
- Native control parity. WPF controls inside the host stay WPF. Migrating each control is the work; Islands just lets you do it incrementally.
- Shared resources. Resource dictionaries, themes, styles in the WPF app do not automatically apply to the Uno page. Theme keys differ between surfaces.
- One-codebase nirvana, day one. That comes when the migration is done. Uno Islands is the path, not the destination.
How This Differs from Other Incremental Patterns
Some commercial WPF-API-compatible cross-platform forks ship a similar mixing capability. The two approaches differ on:
- Target XAML surface. Uno Islands migrates code toward
Microsoft.UI.Xaml. Other patterns migrate toward an independent dialect. - License model. Uno Islands is part of the Apache-2.0 Uno Platform repo at no cost. Commercial forks ship per-application licensing; verify with the vendor.
- Platform reach after migration. Uno Platform ships Windows, macOS, Linux, iOS, Android, WebAssembly. Some commercial forks gate mobile and WebAssembly behind their highest pricing tier.
Pick by what your team wants to invest skills in long-term: WPF-API compatibility through a commercial fork, or the Microsoft.UI.Xaml surface through Uno Platform.
Identify one low-risk WPF screen (typically a settings page or simple form), spin up an Uno Platform class library inside your existing WPF solution, and follow the Uno Islands setup guide. Validate that the embedded page renders inside the WPF host before committing to the broader migration.
Subscribe to Our Blog
Subscribe via RSS
Back to Top