Migrate an iOS app to WinUI 3

June 1, 2026 · View on GitHub

If you have an iOS app and want to bring it to Windows, AI tools can do most of the mapping work. This page provides the key concept translations from UIKit/SwiftUI to WinUI 3. Use these tables as context when prompting your AI agent — providing exact API mappings up front produces far more accurate output than asking for a generic conversion.

Install the WinUI agent plugin first to give your agent accurate WinUI 3 knowledge:

gh copilot plugin install winui@awesome-copilot

Concept mapping

iOS (UIKit / SwiftUI)WinUI 3 equivalentNotes
UIViewControllerPageWinUI pages are navigated via Frame
UINavigationControllerFrame + NavigationViewUse Frame.Navigate() for page transitions
UITabBarControllerNavigationView (top or left tabs)
UITableViewListViewUse ObservableCollection<T> for data binding
UICollectionViewGridView
UIAlertControllerContentDialogMust be parented to the current XamlRoot
UILabelTextBlock
UITextFieldTextBox
UIButtonButton
UIImageViewImage
UIStackViewStackPanelSet Orientation to Horizontal or Vertical
Auto LayoutGrid / StackPanel / RelativePanelXAML layout is row/column based
@State / @Binding (SwiftUI)INotifyPropertyChanged / ObservableProperty (CommunityToolkit.Mvvm)
NSUserDefaultsApplicationData.Current.LocalSettings
URLSessionHttpClientUse System.Net.Http.HttpClient
NotificationCenterEvents or WeakReferenceMessenger (CommunityToolkit.Mvvm)
DispatchQueue.main.asyncDispatcherQueue.TryEnqueue
AppDelegate.applicationDidFinishLaunchingApp.OnLaunched
SceneDelegate / windowSceneMainWindow / AppWindow
FileManagerStorageFolder / StorageFile
UserNotificationsAppNotificationManager (Microsoft.Windows.AppNotifications)

Starter prompt

Use this prompt to give your AI agent the context it needs before starting a migration:

I'm migrating an iOS app to WinUI 3 using the Windows App SDK.

The app is written in [Swift / Objective-C] using [UIKit / SwiftUI].

Apply these mappings:
- UIViewController → Page, navigated via Frame
- UINavigationController → Frame + NavigationView
- UITableView → ListView with ObservableCollection<T>
- UIAlertController → ContentDialog (parented to XamlRoot)
- NSUserDefaults → ApplicationData.Current.LocalSettings
- URLSession → System.Net.Http.HttpClient
- DispatchQueue.main.async → DispatcherQueue.TryEnqueue
- @State / @Binding → INotifyPropertyChanged via CommunityToolkit.Mvvm

Use Microsoft.UI.Xaml.* namespaces throughout — never Windows.UI.Xaml.*.
Generate C# — not Swift.

What doesn't map directly

Some iOS concepts don't have a direct WinUI equivalent: