The Uno Platform Solution Template
Solution Structure
Both the Visual Studio Template Wizard, which comes with the Uno Platform Visual Studio extension, and the dotnet new
unoapp template create a Uno Platform application with the same solution structure. In this guide, we'll explain the different options that can be used to configure the solution that gets generated. The options will be discussed in the groups they appear in the wizard.
Preset selection
Preset
The unoapp
template comes with two preset options: Blank and Recommended (Default in Visual Studio Wizard). These represent two different sets of pre-configured values for the options that follow. The Blank option is the most minimal template, while the Recommended option comes with a few more features pre-configured.
Both presets include the following platforms: Windows, Android, iOS, Mac Catalyst, Desktop, and Wasm.
Blank
The Blank preset option represents the simplest Uno Platform application. Think of this as the "Hello World" of Uno Platform applications. The application has a single page, with a single
TextBlock
. The only additional package reference it includes is to Uno.Resizetizer, which is used to make it easy define the application icon and splash screen for all target platforms.Create an application with the Blank preset:
dotnet new unoapp -preset blank
The Blank preset can be augmented by clicking
Customize
in the Visual Studio Wizard, or by specifying additional command line parameters to thedotnet new
command. For example, this command will create a Blank application with the Uno.Toolkit.dotnet new unoapp -preset blank -toolkit
Recommended
The Recommended preset option represents a more complete Uno Platform application. It uses
Uno.Extensions
to initialize the application by creating anIHost
, using theIHostBuilder
pattern established by the Microsoft.Extensions libraries. The IHost provides a number of services that are useful in Uno Platform applications, including Dependency Injection, Logging, and Configuration.The Recommended option also includes a number of additional packages that are useful in Uno Platform applications, including
Uno.UITest
,Uno.Extensions.Http
,Uno.Extensions.Navigation
,Uno.Extensions.Serialization
, andUno.Extensions.Logging
.Create an application with the Recommended preset:
dotnet new unoapp -preset recommended
The Recommended preset can be augmented by clicking
Customize
in the Visual Studio Wizard, or by specifying additional command line parameters to thedotnet new
command. For example, this command will create a Blank application with out the Uno.Toolkit.dotnet new unoapp -preset blank -toolkit false
For each of the options that follow, we'll define the values that are set for each preset option.
1. Framework
This setting lets you choose the .NET version to target. The default is .NET 8.0, but you can change it to .NET 9.0 Preview!
.NET 8.0
.NET 8.0 is provided as a LTS (Long Term Support) version. This version adds significant performance improvements, as well as other general enhancements. This is the default (for both blank and recommended presets) and the recommended option for new projects
dotnet new unoapp -tfm 8.0
.NET 9.0 Preview
.NET 9.0 is provided as an STS (Standard Term Support) version. This is a preview version to be released at the end of 2024.
dotnet new unoapp -tfm 9.0
2. Platforms
This setting lets you choose which platforms the generated app will target.
Uno Platform currently supports targeting the following operating systems:
- Mobile
- Android
- iOS
- Web
- WebAssembly (wasm)
- Desktop
- Mac (Mac Catalyst)
- Windows App SDK
- Skia Desktop (Linux X11, Linux Framebuffer, Windows, macOS)
Note
For most platforms the name of the command line argument is just the platform name (eg windows or ios). However, for WebAssembly and Mac, use the abbreviation in braces in the above list (i.e. wasm, maccatalyst).
By default, when you create a new Uno Platform app, it will target the following platforms: Windows App SDK, iOS, Android, Mac Catalyst, and Skia Desktop.
The following command only selects the Windows platform:
dotnet new unoapp -platforms windows
To select multiple platforms, the platforms
argument should be supplied multiple times. In the following example, the generated app will target Windows, Android and iOS:
dotnet new unoapp -platforms windows -platforms android -platforms ios
3. Presentation
This setting allows you to choose a presentation architecture.
None
Generates a project without any presentation architecture installed. This is the default for the blank preset.
MVVM
Generates a project optimized for use with the traditional MVVM architecture, using Microsoft's MVVM Community Toolkit.
dotnet new unoapp -presentation mvvm
MVUX
The Model View Update eXtended (MVUX) pattern is a new programming architecture by Uno Platform. This is the default for the recommended preset.
Its main feature is enabling the use of immutable POCO entities and Models (using records) as the presentation layer, making the whole need for implementing property change notification redundant.
To learn more about the MVUX pattern, read this.
dotnet new unoapp -presentation mvux
4. Markup
This setting allows you to choose the markup to use for declaring the UI of the application.
XAML
Use XAML for the declaration of UI. This is the default for both the blank and recommended preset
dotnet new unoapp -markup xaml
C# Markup
Use C# Markup for the declaration of UI.
dotnet new unoapp -markup csharp
5. Theme
Uno platform lets you decide easily which theme or skin to display throughout your app.
This option sets the generated theme or skin to be used in the generated app. The options available are:
Material
Material is Google's design system.
Learn more about Material. This option will result in an application that will have the material theme applied. This is the default for the recommended preset.dotnet new unoapp -theme material
Fluent
Fluent is an open-source design system that drives Windows and WinUI's default style.
Learn more about Fluent Design System. This is the default for the blank preset.dotnet new unoapp -theme fluent
The theme in the application can be further customized with the following options:
Theme Service
Includes references to the Uno.Extensions.Core.WinUI package which includes the theme service that can be used to control the theme (Dark, Light or System) of the application. This is included by default in the recommended preset, but not in the blank preset.
dotnet new unoapp -theme-Service
Import Theme File (Uno.Dsp)
Allows colors in the application to be overridden using a theme file (Material theme only). This is included by default in the recommended preset, but not in the blank preset.
dotnet new unoapp -dsp
6. Extensions
The settings on the Extensions page let you configure which Uno Extensions should be added to the solution and projects generated by the wizard.
Uno Extensions is a set of Extensions that cover common essentials application core building blocks and are supported on all operating systems Uno Platform targets.
Uno.Extensions follow the Microsoft.Extensions model that creates a host environment where you can register additional dependencies. The registered dependencies are then available throughout the application via the Services (IServiceProvider
) property on the IHost
instance.
The available extensions are:
Dependency Injection
Dependency Injection (DI) is an Inversion of Control (IoC) technique that enables consuming classes not to worry about the management or creation of their dependencies and instead rely on a central service to provide it when needed, based on how the provider was configured.
Uno Platform brings the power of Microsoft Extensions Dependency Injection to all operating systems it targets and enhances it with additional functionality through its Uno.Extensions.DependencyInjection library. You can learn more about it in the Uno.Extensions.DependencyInjection overview.
This is included by default in the recommended preset, but not in the blank preset.
Note
Some other features (e.g. Configuration, Http, Authentication as well as others) depend on DI and will be disabled if DI is not enabled.
dotnet new unoapp -di
Configuration
This extension provides a way to load application configuration data from and to various sources using the Options Pattern. This is included by default in the recommended preset, but not in the blank preset.
Refer to the Uno Configuration documentation for more information.
dotnet new unoapp -config
HTTP
Uno.Extensions.Http allows for the registration of API endpoints as multiple typed HttpClient instances. In this centralized location for accessing web resources, the lifecycle of the corresponding HttpMessageHandler objects is managed. Added clients can optionally be configured to use the platform-native handler. Additional functionality is provided to clear cookies or log diagnostic messages in responses. This library uses Microsoft.Extensions.Http for any HTTP-related work. This is included by default in the recommended preset, but not in the blank preset.
For more documentation on HTTP requests, read the documentation.
Refer to the documentation to learn how to use it in an Uno Platform app.
dotnet new unoapp -http
Localization
The Localization extension is responsible for managing globalization in your app.
This enables keeping all translations of your app in a single place and enables the user to easily switch the UI language.
The generated app contains resw files, which are used to define the application strings. The supported languages are configured in appsettings.json. To learn how to switch the UI culture, refer to the localization tutorial.
The default settings come with the following pre-set languages: English (en), Spanish (es), French (fr), and Portuguese - Brazil (pt-BR).
Uno.Extensions.Localization expands Microsoft.Extensions.Localization to all OSs supported by Uno Platform.
This is included by default in the recommended preset, but not in the blank preset.
Read the full Localization documentation here or learn more about Globalization.
dotnet new unoapp -loc
Navigation
Regions
Navigation is an integral part of any app and for that, Uno Platform has developed a navigation system that is registered and served using DI and is fully integrated with the navigation-specific UI controls out there, such as
Frame
,NavigationView
, andTabBar
.It is a region-based navigation. A Region is the abstraction of the view responsible for handling navigation. Regions are structured into a logical hierarchical representation that shadows the navigation-aware controls in the visual hierarchy. The hierarchy allows navigation requests to be propagated up to the parent and down to child regions as required.
This library is also responsible for showing pop-ups, flyouts, dialogs, and other interactions with the user.This is the default navigation in the recommended preset.
Learn more about Uno's Navigation library here.
dotnet new unoapp -nav regions
Blank
Provides the default WinUI frame navigation. This is the default navigation in the blank preset.
dotnet new unoapp -nav blank
Logging
Logging is a crucial component in an app that enables the developer to emit log messages whenever an important action or execution is taken by the app. This then lets you trace back any errors or issues that may arise in the future. There are several Logging tools out there, with one of the most common of them being Microsoft.Extensions.Logging.
Uno Platform provides its Uno.Extensions.Logging to bring Logging to all platforms it supports.
Uno.Extensions.Logging is covered in more detail here.
Console
Generates an app configured to write debug-level logging information to the Console. This is the default logging in the blank preset.
dotnet new unoapp -log none
Default
Generates an app that uses Dependency Injection to configure logging that writes output to Console. This is the default logging for the recommended preset.
dotnet new unoapp -log default
Serilog
Generates an app that uses Dependency Injection to configure logging with Serilog.
dotnet new unoapp -log serilog
Refer to the Logging documentation for more information.
7. Features
Toolkit
Installs the Uno.Toolkit package in the project, this package adds a set of custom controls, behaviors, extensions and other utilities to Uno Platform projects that are not offered out-of-the-box by WinUI.
This includes Card
, TabBar
, NavigationBar
and others.
This is included by default in the recommended preset, but not in the blank preset.
dotnet new unoapp -toolkit
Tip
The Uno Toolkit is demonstrated as a live web app here. It is also available as an iOS or Android app.
The Gallery app is open-source and is available on GitHub.
.NET MAUI Embedding
Adds support for embedding .NET MAUI controls and third party libraries into an application. This is not included in either the blank or recommended presets.
dotnet new unoapp -maui
Server
Adds an ASP.NET Core Server project to the solution, which hosts the WASM project, and can also be used to create an API and endpoints. It can also be used as the data server and you can also choose to implement the authentication server code in it.
This is included by default in the recommended preset, but not in the blank preset.
dotnet new unoapp -server
PWA Manifest
Includes a PWA (Progressive Web Apps) manifest that enables easy installation of the WASM web-target as an app in the running device.
This is included by default in both the blank and recommended presets.
Note
As this is a WASM feature it will be disabled (Wizard), or ignored (dotnet new), if WASM is not selected as one of the output target platforms.
dotnet new unoapp -pwa
Visual Studio Code debugging
Enables Uno Platform debugging in Visual Studio Code. This is included by default in both the blank and recommended presets.
dotnet new unoapp -vscode
WASM Multi-Threading
Enables multi-threading in the WASM project.
This option is only available if WASM is selected as one of the output target platforms. This is not enabled in either blank or recommended presets.
dotnet new unoapp -wasm-multi-threading
8. Authentication
Adds Uno Platform's Custom Authentication support to the generated project.
Using Uno's authentication tools you can easily integrate in your app a login screen and authenticate users. It also helps you manage and track the state of the app's authentication, by allowing you to log out or switch users as well as other authentication-related actions.
Uno.Extensions.Authentication currently supports these types of authentication:
None
No authentication is added to the application. This is the default for both blank and recommended presets.
dotnet new unoapp -auth none
Custom
Provides a customized login experience for performing login, refresh, or logout. This is also the authentication type that is generated with the project template when Custom Authentication is selected. The other types are not supported yet at the moment but they're on the roadmap and will come to the wizard soon.
dotnet new unoapp -auth custom
MSAL
MSAL (formerly AzureAD) stands for Microsoft Authentication Library, is part of the Microsoft Identity Platform and enables acquiring authentication tokens and access of protected APIs using OAuth2 and OpenID.
dotnet new unoapp -auth msal
OIDC
Also referred to as OpenID Connect, is a simple identity layer using the OAuth 2.0 protocol.
dotnet new unoapp -auth oidc
Web
Web authentication is achieved via a web page that the app sends over to be opened in the browser and gets a token result once the login process is completed successfully.
dotnet new unoapp -auth web
Read the Authentication documentation to get more knowledge about Uno Platform's authentication support and the tools it provides.
Note
The Authentication option is selected by default in the Default template, and not in the Blank one. This option is dependent on the DependencyInjection option and is only shown if the latter is enabled.
9. Application
Application ID
This option sets the iOS/macOS application Bundle ID to be used in the App Store.
The Application ID is also used as the Win App SDK Application ID setting for the app.
dotnet new unoapp -id com.mycompany.myapp
Publisher
This option sets the Publisher name in the Win App SDK settings.
dotnet new unoapp -pub 'O=My Company, C=US'
10. Testing
Unit tests
Adds an NUnit test project that targets the main (shared) head project.
The project also comes with FluentAssertions pre-installed.
This is included in the recommended preset, but not in the blank preset.
dotnet new unoapp -tests unit
UI tests
Adds an NUnit-powered test app that provides UI testing capabilities using Uno Platform's UI testing tools (Uno.UITest).
To learn more about UI Testing in Uno Platform apps, read this.
This is included in the recommended preset, but not in the blank preset.
dotnet new unoapp -tests ui
You can include both types of tests by including the parameter multiple times:
dotnet new unoapp -tests ui -tests unit
Alternatively, to include no tests, use the none
parameter:
dotnet new unoapp -tests none
11. CI Pipeline
None
No CI pipeline will be created. This is the default option for both the blank and recommended presets.
dotnet new unoapp -ci none
Azure Pipelines
Adds a YAML file that can be used to create a CI pipeline in Azure Pipelines.
dotnet new unoapp -ci azure
GitHub Action
Adds a YAML file that can be used to create a CI pipeline in GitHub Actions.
dotnet new unoapp -ci github