# Uno Platform The Uno Platform is an Open-Source .NET platform for building single-codebase, cross-platform applications for mobile, web (using WebAssembly), desktop, and embedded apps quickly. Important notes: - The core framework is free and open-source under the Apache 2 license, since its release in 2018; optional enterprise support and advanced tooling (such as Hot Design) are offered under paid plans - Skia (using a full-screen canvas) and Native (using native elements) renderers are available - Uno Platform uses the WinUI (UI APIs) and WinRT (non-UI APIs) API definitions, but does not use WinAppSDK/WinUI. WinAppSDK is only used when running the `netX.0-windows` target, for the other targets, only Uno Platform code is used - Uno Platform uses official .NET mobile bindings directly, but does not use MAUI - Uno Platform offers a comprehensive C# and XAML Hot Reload support, under the free plan - Uno Platform apps can run on iOS/iPadOS, Android, macOS, Windows, Linux, and Browsers supporting WebAssembly ## Table of Contents - [Get Started](#Uno.GetStarted) - [Setup](#Uno.GetStarted.vs2022) - [Visual Studio](#Uno.GetStarted.vs2022) - [VS Code](#Uno.GetStarted.vscode) - [Rider](#Uno.GetStarted.Rider) - [Claude Code](#Uno.GetStarted.AI.Claude) - [Codex](#Uno.GetStarted.AI.Codex) - [GitHub Copilot CLI](#Uno.GetStarted.AI.CopilotCLI) - [Cursor](#Uno.GetStarted.AI.Cursor) - [Sign in with Uno Platform](#Uno.GetStarted.Licensing) - [Create an App](#Uno.GettingStarted.CreateAnApp.VS2022) - [Visual Studio 2022/2026](#Uno.GettingStarted.CreateAnApp.VS2022) - [VS Code](#Uno.GettingStarted.CreateAnApp.VSCode) - [Rider](#Uno.GettingStarted.CreateAnApp.Rider) - [Claude Code](#Uno.GettingStarted.CreateAnApp.AI.Claude) - [Codex](#Uno.GettingStarted.CreateAnApp.AI.Codex) - [GitHub Copilot CLI](#Uno.GettingStarted.CreateAnApp.AI.CopilotCli) - [Cursor](#Uno.GettingStarted.CreateAnApp.AI.Cursor) - [Build your app](#Uno.GetStarted.Explore) - [AI Agents](#Uno.BuildYourApp.AI.Agents) - [Hot Reload](#Uno.Features.HotReload) - [App Structure](#Uno.Development.AppStructure) - [Troubleshoot](#Uno.UI.CommonIssues) - [Overview](#Uno.UI.CommonIssues) - [Hot Reload](#Uno.Features.HotReload#troubleshooting) - [Uno Platform Status](#Uno.Development.UnoPlatformStatus#troubleshooting) - [Development Environments](#Uno.UI.CommonIssues.AllIDEs) - [All Development Environments](#Uno.UI.CommonIssues.AllIDEs) - [Visual Studio 2022/2026](#Uno.UI.CommonIssues.vs2022) - [VS Code](#Uno.UI.CommonIssues.vscode) - [Rider](#Uno.UI.CommonIssues.rider) - [Android & iOS Emulators](#Uno.UI.CommonIssues.MobileDebugging) - [AI Agents](#Uno.UI.CommonIssues.AIAgents) - [Platforms](#Uno.UI.CommonIssues.Wasm) - [WebAssembly](#Uno.UI.CommonIssues.Wasm) - [Skia (Gtk/Wpf/Framebuffer)](#Uno.UI.CommonIssues.Skia) - [iOS](#Uno.UI.CommonIssues.Ios) - [Android](#Uno.UI.CommonIssues.Android) - [Build Errors](#Uno.Development.Troubleshooting) - [Troubleshooting build errors](#Uno.Development.Troubleshooting) - [Build error codes](#Build.Solution.error-codes) - [Samples & Tutorials](#Uno.SamplesTutorials.Overview) - [Overview](#Uno.SamplesTutorials.Overview) - [Counter](#Uno.Workshop.Counter) - [Counter App](#Uno.Workshop.Counter) - [XAML + MVUX](#Uno.Workshop.Counter.XAML.MVUX) - [XAML + MVVM](#Uno.Workshop.Counter.XAML.MVVM) - [C# Markup + MVUX](#Uno.Workshop.Counter.CSharp.MVUX) - [C# Markup + MVVM](#Uno.Workshop.Counter.CSharp.MVVM) - [Hot Design](#Uno.HotDesign.GetStarted.CounterTutorial) - [Simple Calc](#Workshop.SimpleCalc.Overview) - [Tube Player](#Workshop.TubePlayer.Overview) - [Chefs](#Uno.Chefs.Overview) - [Tutorials](#Uno.Tutorials.Intro) - [Overview](#Uno.Tutorials.Intro) - [How to deploy a WebAssembly app on Azure Static Web Apps](#Uno.Tutorials.AzureStaticWebApps) - [How to use Windows Community Toolkit](#Uno.Development.CommunityToolkit) - [Windows Community Toolkit - Version 8.x](#Uno.Development.CommunityToolkit.v8) - [Windows Community Toolkit - Version 7.x](#Uno.Development.CommunityToolkit.v7) - [How to manually add a splash screen](#Uno.Development.SplashScreen) - [How to use native Frame navigation](#Uno.Tutorials.UseNativeFrameNav) - [How to consume a web API](#Uno.Development.ConsumeWebApi) - [How to localize text resources](#Uno.Tutorials.Localization) - [How to change app language at runtime](#Uno.Tutorials.ChangeAppLanguage) - [How to integrate SignalR](#Uno.Development.SignalR) - [How to use MSAL for Azure Authentication](#Uno.Interop.MSAL) - [How to authenticate with OpenID Connect](#Uno.Tutorials.OpenIDConnect) - [How to implement a sign-in with Apple Button](#Uno.Tutorials.SignInWithApple) - [Embed a JavaScript Component](#Uno.Interop.WasmJavaScript1) - [Part 1](#Uno.Interop.WasmJavaScript1) - [Part 2](#Uno.Interop.WasmJavaScript2) - [Part 3](#Uno.Interop.WasmJavaScript3) - [Deploy to Raspberry Pi](#Uno.RaspberryPi.Intro) - [Community Tutorials](#Uno.Tutorials.CommunityTutorials) - [Samples](#Uno.Samples) - [Additional Resources](#Uno.GetStarted.NextSteps) - **Overview** - [Introduction](#Uno.Documentation.Intro) - **Architecture** - [Supported Platforms](#Uno.GettingStarted.Requirements) - [.NET Version Support](#Uno.Development.NetVersionSupport) - [Philosophy](#Uno.Overview.Philosophy) - [How Uno Works](#Uno.Development.HowItWorks) - **UI Renderers** - [Skia Renderer](#uno.features.renderer.skia) - [Native Renderer](#uno.features.renderer.native) - [Best Practices](#Uno.Development.BestPractices) - **Authoring** - [Using the Uno.SDK](#Uno.Features.Uno.Sdk) - [UI Markup](#uno.development.using.markup) - [Platform-specific C# code](#Uno.Development.PlatformSpecificCSharp) - [Platform-specific XAML markup](#Uno.Development.PlatformSpecificXaml) - [Creating Custom Controls](#Uno.Tutorials.CreatingCustomControls) - [Control Libraries](#Guide.HowTo.Create-Control-Library) - [Adding New Platforms](#Uno.Guides.AddAdditionalPlatforms) - [New Projects in Existing Solutions](#Uno.Guides.AddUnoToExistingSolution) - [Using the Skia Desktop](#Uno.Skia.Desktop) - [Linux Framebuffer](#Uno.Skia.Linux.Framebuffer) - [Using Skia Desktop (macOS)](#Uno.Skia.macOS) - [Getting Started With Tests](#Uno.Authoring.Tests) - [Logging](#Uno.Development.Logging) - [AppManifest (WebAssembly)](#Uno.Development.WasmAppManifest) - [Using the server project](#Uno.Guides.UsingTheServerProject) - [Hosting a WebAssembly app](#Uno.Development.HostWebAssemblyApp) - **Debugging** - [How to create a repro sample](#Uno.Development.Create-Repro) - ['Debugging C# on WASM'](#Uno.Development.DebuggingWasm) - [VS Code Advanced Mobile Debugging](#uno.vscode.mobile.advanced.debugging) - [Generic Unhandled Exceptions handler](#Uno.Development.UnhandledExceptions) - [Debugging Troubleshooting](#Uno.Debugging.Troubleshooting) - **Embedding** - [Uno Platform in WPF](#Uno.Tutorials.UnoIslands) - [Native Views](#Uno.Development.NativeViews) - [Native Views with Skia](#Uno.Skia.Embedding.Native) - **Upgrading** - [Upgrading NuGet Packages](#Uno.Development.UpgradeUnoNuget) - [Upgrading from previous releases](#Uno.Development.MigratingFromPreviousReleases) - [Upgrading to Single Project](#Uno.Development.MigratingToSingleProject) - [Upgrading to Uno 6.0](#Uno.Development.MigratingToUno6) - [Upgrading to Uno 5.0](#Uno.Development.MigratingToUno5) - [Upgrading from .NET 9 to .NET 10](#Uno.Development.MigratingFromNet9ToNet10) - [Upgrading from .NET 8 to .NET 9](#Uno.Development.MigratingFromNet8ToNet9) - [Upgrading from .NET 7 to .NET 8](#Uno.Development.MigratingFromNet7ToNet8) - [Upgrading from Xamarin to .NET 6](#Uno.Development.MigratingFromXamarinToNet6) - [Upgrading to WinUI 3.0](#Uno.Development.UpdatingToWinUI3) - **Migrating** - [Xamarin Forms](#Uno.XamarinFormsMigration.Overview) - **WPF** - [Migrating WPF Apps to Web](#Uno.Development.WPFMigration) - **UWP-only code** - [Overview](#Uno.Development.MigrateExistingCode) - [Checklist](#Uno.Development.MigratingBeforeYouStart) - [Applications](#Uno.Development.MigratingApps) - [Class libraries](#Uno.Development.MigratingLibraries) - [General guidance](#Uno.Development.MigratingGuidance) - [Silverlight](#Uno.SilverlightMigration.Landing) - **Publishing** - [Overview](#uno.publishing.overview) - [Publishing for Desktop](#uno.publishing.desktop) - [Publishing Your App for Desktop](#uno.publishing.desktop) - [Publishing Your App for macOS](#uno.publishing.desktop.macos) - [Publishing Your App for macOS - Advanced Topics](#uno.publishing.desktop.macos.advanced) - [Publishing Your App for Linux](#uno.publishing.desktop.linux) - [Publishing for WebAssembly](#uno.publishing.webassembly) - [Publishing for Windows App SDK](#uno.publishing.windows) - [Build Packaged Unsigned Apps](#uno.publishing.windows.sideload.packaged.unsigned) - [Build Packaged Signed Apps](#uno.publishing.windows.sideload.packaged.signed) - [Build Unpackaged Apps](#uno.publishing.windows.sideload.unpackaged.unsigned) - [Publishing for iOS](#uno.publishing.ios) - [Publishing for Android](#uno.publishing.android) - **Performance** - [Improving Build Times](#Build.Solution.TargetFramework-override) - [Performance tips](#Uno.Development.Performance) - [Memory Profiling](#Uno.Contributing.MemoryIssues) - [How to profile applications](#Uno.Tutorials.ProfilingApplications) - [IL Linker for WebAssembly](#uno.articles.features.illinker) - [Skia Native Libraries Trimming](#Uno.Features.SkiaLibrariesTrimming) - [Working with String Resource Trimming](#Uno.Features.StringResourceTrimming) - [Working with XAML Trimming](#Uno.Features.ResourcesTrimming) - [Error Monitoring & Crash Reporting with Raygun](#Monitoring.Raygun) - **Contributing** - [Overview](#Uno.Contributing.Intro) - [Code of Conduct](https://github.com/unoplatform/uno/blob/master/CODE_OF_CONDUCT.md) - [Ways to contribute](#Uno.Contributing.WaysToContribute) - **How Uno works** - [Overview](#Uno.Contributing.Overview) - [Android](#Uno.Contributing.Android) - [Layouting in Android](#Uno.Contributing.LayoutingAndroid) - [iOS](#Uno.Contributing.iOS) - [Layouting in iOS](#Uno.Contributing.LayoutingiOS) - [WASM](#Uno.Contributing.Wasm) - [macOS](#Uno.Contributing.macOS) - [DependencyProperty backing generator](#Uno.Contributing.DependencyPropertyGenerator) - [x:Bind in Uno Platform](#Uno.Contributing.xBind) - [ListViewBase](#Uno.Contributing.ListViewBase) - [ThemeResource](#Uno.Contributing.ThemeResource) - [InteractionTracker internals](#articles-uno-development-interaction-tracker-internals) - [Building Uno.UI](#Uno.Contributing.BuildingUno) - [Debugging Uno.UI](#Uno.Contributing.DebuggingUno) - [Using Codespaces](#Uno.Features.Codespaces) - [Using Ona](#Uno.Features.Gitpod) - [Inspecting the visual tree](#Uno.Contributing.InspectVisualTree) - [Guidelines for code style](#Uno.Contributing.CodeStyle) - [Using the SamplesApp](#Uno.Contributing.SamplesApp) - **Guidelines for creating tests** - [Overview](#Uno.Contributing.CreatingTests) - [Mocked unit tests (Uno.UI.Tests)](#Uno.Contributing.CreateMockedTests) - [Platform-runtime unit tests (Uno.UI.RuntimeTests)](#Uno.Contributing.CreateRuntimeTests) - [UI tests with Uno.UITest](#Uno.Contributing.CreateUITests) - [Debugging Solution Templates](#Uno.Contributing.DebuggingTemplates) - [Conventional Commits format](#Uno.Contributing.ConventionalCommits) - [Guidelines for pull-requests](#Uno.Contributing.PullRequests) - [Guidelines for breaking changes](#Uno.Contributing.BreakingChanges) - [Guidelines for updating dependencies](#Uno.Contributing.UpdatingDependencies) - [Guidelines for issue triage](#Uno.Contributing.IssueTriage) - [Guidelines for implementing a new WinUI/WinRT feature](#Uno.Contributing.ImplementWinUIWinRTAPI) - [Adding documentation](#Uno.Contributing.Docs) - [DocFX](#Uno.Contributing.DocFx) - [Uno.UI release procedure](#Uno.Contributing.ReleaseProcedure) - [Build Artifacts](#Uno.Contributing.Artifacts) - **Advanced topics** - [Adding functionality with API extensions](#Uno.Contributing.ApiExtensions) - [The WeakEventHelper class](#Uno.Contributing.WeakEventHelper) - [Debugging Uno.UI Java code with Android studio](#Uno.Contributing.AndroidStudio) - [Troubleshooting Memory Issues](#Uno.Contributing.MemoryIssues) - [Troubleshooting Source Generation](#Uno.Contributing.SourceGeneration) - [The XAML Trimming phase](#Uno.Contributing.XamlResourceTrimming) - [Hot Reload internals](#Uno.Contributing.Internals.HotReload) - [Why use Uno Platform?](#Uno.Overview.WhyUno) - [FAQ](#Uno.Development.FAQ) - **Studio** - [Overview](#Uno.Platform.Studio.Overview) - [Uno MCPs](#Uno.Features.Uno.MCPs) - [Hot Reload](#Uno.Platform.Studio.HotReload.Overview) - [Feedback](#Uno.Platform.Studio.Feedback) - **Reference** - **Overview** - [Developing with Uno Platform](#Uno.Development.Overview) - [Features List](#Uno.Development.SupportedFeatures) - [Feature Flags](#Uno.Development.FeatureFlags) - **WinUI Compatibility** - [Differences From WinUI](#Uno.Development.ApiDifferences) - [About NotImplemented members](#Uno.Development.NotImplemented) - [Uno and WinUI 3](#Uno.Development.UwpVsWinUI3) - [WinAppSDK Specifics](#Uno.Features.WinAppSDK) - **WinUI links** - [Overview](#Uno.Development.WinUIDoc) - [Tutorials](#Uno.Development.WinUITutorialsDoc) - [Development](#Uno.Development.WinUIDevelopmentDoc) - [Design](#Uno.Development.WinUIDesignDoc) - **UI** - **Controls** - [Implemented Views](#articles-implemented-views) - **Uno Specifics** - [AdaptiveTrigger](#Uno.Features.AdaptiveTrigger) - [Activities in Android](#Uno.Development.AndroidActivities) - [ComboBox](#Uno.Controls.ComboBox) - [CommandBar](#Uno.Controls.CommandBar) - [DatePicker](#Uno.Controls.DatePicker) - [ElevatedView](#Uno.Features.ElevatedView) - [Fluent icon font](#Uno.Development.FluentAssets) - [Flyout](#Uno.Controls.Flyout) - [Frame](#Uno.Controls.Frame) - [GLCanvasElement](#Uno.Controls.GLCanvasElement) - [Image](#Uno.Features.Image) - [ListView and GridView](#Uno.Controls.ListViewBase) - [Lottie animations](#Uno.Features.Lottie) - [MapControl](#Uno.Controls.MapControl) - [MediaPlayerElement](#Uno.Controls.MediaPlayerElement) - [MenuFlyout](#Uno.Controls.MenuFlyout) - [NavigationView](#Uno.Controls.NavigationView) - [Native control styles](#Uno.Development.NativeStyles) - [Other features](#Uno.Development.AdditionalFeatures) - [Pivot](#Uno.Controls.Pivot) - [Popup](#Uno.Controls.Popup) - [ProgressRing](#Uno.Features.ProgressRing) - [RefreshContainer (Pull to Refresh)](#Uno.Controls.RefreshContainer) - [ScrollViewer](#Uno.Controls.ScrollViewer) - [SKCanvasElement](#Uno.Controls.SKCanvasElement) - [TextBox](#Uno.Controls.TextBox) - [TimePicker](#Uno.Controls.TimePicker) - [ToggleSwitch](#Uno.Controls.ToggleSwitch) - [URI Protocol activation](#Uno.Features.ProtocolActivation) - [Using pointer cursors](#Uno.Features.Cursors) - [Using SVG images](#Uno.Features.SVG) - [VisibleBoundsPadding](#Uno.Features.VisibleBoundsPadding) - [WebView (WebView2)](#Uno.Controls.WebView2) - **Features** - [Accessibility](#Uno.Features.Accessibility) - [Animations](#Uno.Features.Animations) - [Assets and image display](#Uno.Features.Assets) - [Build telemetry](#Uno.Development.ToolchainTelemetry) - [Composition API](#Uno.Development.Composition) - [Customizing the UIApplicationDelegate on iOS](#Uno.Features.CustomizingUIApplicationDelegate) - [Dialogs](#Uno.Features.Dialogs) - [Fluent styles](#Uno.Features.FluentStyles) - [Focus management](#Uno.Features.FocusManagement) - [Fonts](#Uno.Features.CustomFonts) - [Markup Extensions](#Uno.Features.WinUIMarkupExtension) - [Native frame navigation](#Uno.Features.NativeFrameNav) - [Orientation](#Uno.Features.Orientation) - [Routed Events](#Uno.Features.RoutedEvents) - [Shapes & Brushes](#Uno.Features.ShapesAndBrushes) - [String resources and localization](#Uno.Features.Localization) - [Succinct syntax](#Uno.Features.WinUISuccinctSyntax) - [Themes](#Uno.Features.Themes) - [User inputs - Keyboard, Pointers, Gestures, Manipulations, Drag and drop](#Uno.Features.UserInputs) - [Using Fluent styles in legacy apps](#Uno.Features.WinUI2) - [Windowing](#Uno.Features.WinUIWindow) - [Preventing Window Closing](#Uno.Features.AppCloseHandler) - [x:Bind](#Uno.Features.WinUIxBind) - [3rd-party libraries](#Uno.Development.SupportedLibraries) - **Non-UI** - [Overview](#uno.features.uno.winrt) - [Accelerometer](#Uno.Features.Accelerometer) - [Android TV](#Uno.Features.AndroidTv) - [App Actions](#Uno.Features.WinUIStartScreen) - [App Suspension](#Uno.Features.WinUIApplication) - [Application Data and Settings](#Uno.Features.ApplicationData) - [Badge Notifications](#Uno.Features.WinUINotifications) - [Barometer](#Uno.Features.Barometer) - [Battery Information](#Uno.Features.WSPower) - [Bluetooth](#Uno.Features.BluetoothDevice) - [Capture (Camera)](#Uno.Features.Capture) - [Clipboard](#Uno.Features.Clipboard) - [Compass](#Uno.Features.Compass) - [Contacts](#Uno.Features.WAMContacts) - [Credential Storage](#Uno.Features.PasswordVault) - [Device Enumeration](#Uno.Features.WDEnumeration) - [Device Information](#Uno.Features.WSProfile) - [E-mail](#Uno.Features.WAMEmail) - [File and Folder Pickers](#Uno.Features.WSPickers) - [File Management](#Uno.Features.FileManagement) - [Flashlight](#Uno.Features.Flashlight) - [Gamepad](#Uno.Features.Gamepad) - [Geolocation (GPS)](#Uno.Features.WDGeolocation) - [Gyrometer](#Uno.Features.Gyrometer) - [Haptics](#Uno.Features.WDHaptics) - [Hardware back button](#Uno.Features.HardwareBackButton) - [Keeping Screen On](#Uno.Features.WSDisplay) - [Light Sensor](#Uno.Features.LightSensor) - [Magnetometer](#Uno.Features.Magnetometer) - [MIDI](#Uno.Features.WDMidi) - [Network Information](#Uno.Features.WNetworking) - [Orientation Sensor](#Uno.Features.OrientationSensor) - [Package Information](#Uno.Features.WAM) - [Phone Calls](#Uno.Features.WAMCalls) - [Proximity Sensor](#Uno.Features.ProximitySensor) - [Settings](#Uno.Features.Settings) - [Sharing](#Uno.Features.WAMDataTransfer) - [SMS](#Uno.Features.WAMChat) - [Speech Recognition](#Uno.Features.SpeechRecognition) - [Step Counter](#Uno.Features.StepCounter) - [Store Context](#Uno.Features.StoreContext) - [Title Bar Customization](#Uno.Features.WinUIViewManagement) - [URI Launcher](#Uno.Features.WS) - [Vibration](#Uno.Features.WPDNotification) - [Wallpaper and Lock Screen](#Uno.Features.WSUserProfile) - [Web Authentication Broker](#Uno.Features.WAB) - [Working with cookies](#Uno.Features.Cookies) - **Tooling** - [Uno Platform Status](#Uno.UnoPlatformStatus) - [Dev Server](#Uno.DevServer) - **VS Code Extension** - [Visual Studio Code Extension](#Uno.vscode.additional) - [C# Dev Kit Support](#Uno.GetStarted.vscode.DevKit) - [Omnisharp Support](#Uno.GetStarted.vscode.OmniSharp) - **Rider** - [License Agreement](#Uno.Rider.EULA) - **Templates** - [Visual Studio Wizard](#Uno.GettingStarted.UsingWizard) - [dotnet new Templates](#Uno.GetStarted.dotnet-new) - [Get started wizard](#Uno.GetStarted.Wizard) ## Uno.vscode.additional # Visual Studio Code Extension To get started on using VS Code, [head over to our guides](#Uno.GetStarted.vscode). In this page, you'll find other topics about VS Code support, such as code snippets or how to upgrade an existing app to use VS Code. ## Explore other features The Uno Platform extension provides additional features to help you develop your application. You can explore them by pressing `F1` or `Ctrl-Shift-P` and typing `Uno Platform` to see the list of available commands. ![vs-code-explore-other-features](Assets/quick-start/vs-code-explore-other-features.png) ## Using code snippets ### Adding a new Page 1. In the MyApp folder, create a new file named `Page2.xaml` 2. Type `page` then press the `tab` key to add the page markup 3. Adjust the name and namespaces as needed 4. In the MyApp folder, create a new file named `Page2.xaml.cs` 5. Type `page` then press the `tab` key to add the page code behind C# 6. Adjust the name and namespaces as needed ### Adding a new UserControl 1. In the MyApp folder, create a new file named `UserControl1.xaml` 2. Type `usercontrol` then press the `tab` key to add the page markup 3. Adjust the name and namespaces as needed 4. In the MyApp folder, create a new file named `UserControl1.xaml.cs` 5. Type `usercontrol` then press the `tab` key to add the page code behind C# 6. Adjust the name and namespaces as needed ### Adding a new ResourceDictionary 1. In the MyApp folder, create a new file named `ResourceDictionary1.xaml` 2. Type `resourcedict` then press the `tab` key to add the page markup ### Other snippets - `rd` creates a new `RowDefinition` - `cd` creates a new `ColumnDefinition` - `tag` creates a new XAML tag - `set` creates a new `Style` setter - `ctag` creates a new `TextBlock` close XAML tag ## Updating an existing application to work with VS Code An existing application needs additional changes to be debugged properly. 1. At the root of the workspace, create a folder named `.vscode` 2. Inside this folder, create a file named `launch.json` and copy the [contents of this file](https://github.com/unoplatform/uno.templates/blob/main/src/Uno.Templates/content/unoapp/.vscode/launch.json). 3. Replace all instances of `MyExtensionsApp._1` with your application's name in `launch.json`. 4. Inside this folder, create a file named `tasks.json` and copy the [contents of this file](https://github.com/unoplatform/uno.templates/blob/main/src/Uno.Templates/content/unoapp/.vscode/tasks.json). ## Advanced debugging You can find [advanced Code debugging topic here](#uno.vscode.mobile.advanced.debugging). ## Uno.Development.AndroidActivities # Managing activities in Android [Activities](https://developer.android.com/reference/android/app/Activity) are an integral element of the Android platform. By default your Uno Platform application runs in a single activity, but you might for example spawn a new activity when a user shares content, or picks an image from their device. This article covers Activity management in Uno. ## Android documentation links - [Introduction to Activities](https://developer.android.com/guide/components/activities/intro-activities) - [Understand the Activity Lifecycle](https://developer.android.com/guide/components/activities/activity-lifecycle) ## Creating/Using Android Activities At the root of every Android Uno app, lies a `BaseActivity` class that extends from `Android.Support.V7.App.AppCompatActivity` which is part of the [Android v7 `AppCompat` Support Library](https://developer.android.com/topic/libraries/support-library/features.html#v7-appcompat). If you ever need to create a new Activity within your app or within Uno, you must be sure to extend `BaseActivity` and, if you need to apply a Theme to the activity, ensure that the Theme you set is a `Theme.AppCompat` theme (or descendant). ## Accessing Android main activity events Uno Platform provides an API to get access to the events/overrides invoked in the main activity (commonly inheriting from `UI.Xaml.ApplicationActivity`) outside of the activity class. In order to get access to these events, you can write the following: ```csharp using Uno.UI.ViewManagement; App() { // ... ApplicationViewHelper.GetBaseActivityEvents().Create += OnCreateEvent; // ... } private void OnCreateEvent(Android.OS.Bundle savedInstanceState) { } ``` Note that some events are raised early during the application lifecycle and may need to be registered from the `App` constructor. ## Uno.Development.ApiDifferences # Differences between Uno.UI and WinUI Uno Platform strives to closely replicate the WinUI API on all platforms and ensure that existing WinUI code is 100% compatible with Uno. This article covers areas where Uno.UI's implementation differs, typically to better integrate with the native platform, or where the capabilities of .NET differ due to inherent limitations of the native platform. This article doesn't cover parts of the API that haven't been implemented yet. You can consult a [complete list of implemented and unimplemented controls here](implemented-views.md). For a practical guide to addressing differences between Uno Platform and WinUI, [read this article](migrating-guidance.md). ## API differences ### `FrameworkElement` inherits from native base view types (Android, iOS, macOS) As for WinUI, all visual elements in Uno.UI inherit from `FrameworkElement`, which inherits from `UIElement`. (At least, those that are publicly available.) On Windows, `UIElement` inherits from the `DependencyObject` class, which inherits from `System.Object`. On Android, iOS, and macOS, `UIElement` instead inherits from the native base view type for each platform, as exposed to .NET by Xamarin Native. So, `ViewGroup` for Android, `UIView` for iOS, and `NSView` for macOS. This allows native views (not defined by Uno.UI or inheriting from `FrameworkElement`) to be directly integrated into the visual tree, [in XAML markup or C# code](native-views.md). ### `DependencyObject` type is an interface (all non-Windows platforms) This API difference follows directly from the previous one. In order to support native view inheritance, Uno.UI defines `DependencyObject` as an interface, rather than a class. This is as transparent as possible to the application developer. For example, if a developer defines a class that inherits directly from `DependencyObject`, Uno.UI will automatically generate code that implements the `DependencyObject` interface methods. The only developer action required is to add the `partial` keyword to the class definition. ## Runtime differences ### iOS is AOT-only .NET code [must be Ahead-Of-Time (AOT) compiled to run on iOS](https://learn.microsoft.com/xamarin/ios/internals/limitations), as a fundamental platform limitation. As a result, a few APIs that require runtime code generation (eg `System.Reflection.Emit`) do not work. This includes code that uses the `dynamic` keyword. ### WebAssembly is single-threaded Currently, WebAssembly code in the browser executes on a single thread. This limitation is expected to be lifted in the future, but for now, code that expects additional threads to be available may not function as expected. [This GitHub issue](https://github.com/unoplatform/uno/issues/2302) tracks support for multi-threading on WebAssembly in Uno Platform. ## Uno.Development.BestPractices # Best practices for developing Uno Platform applications This article covers some basic best practices when developing cross-platform applications with Uno Platform. ## Questions to ask 1. Which [platforms](#Uno.GettingStarted.Requirements) do I plan to target? 2. What framework features do I plan to use? Are they supported on all of my planned target platforms? 3. Which major third-party dependencies will I use? Are they supported on all of my planned target platforms? ## Development workflow Testing and debugging your application is easier and more rapid on some platforms and trickier and more time-consuming on others. Depending on where you're at in your development cycle, it may make sense to test all platforms, or it may make sense to focus on the 'easiest' platform. 1. **At the beginning of the development cycle,** you should identify key features from the Uno Platform framework and 3rd-party dependencies that you plan to use. Check that the framework controls you plan to use [are implemented](implemented-views.md). Consider creating a simple proof-of-concept (POC) app covering the 'riskiest' features and testing it on all platforms you're targeting. 2. **In the middle of the development cycle,** once the major pieces are in place, when you're iterating on the UI and business logic of your application, most of your day-to-day development should focus on the easiest platform to develop on. Most of the time, this will be Windows, where you can take advantage of Microsoft's excellent tooling (Live Visual Tree, XAML Hot Reload, etc) and where build times are often shortest. For this reason, it's recommended to keep the Windows (WinUI 3) head project in your solution, even if you don't plan to publish your application to Windows. 3. **At the end of the development cycle,** as your attention shifts to testing and fixing bugs, you'll again distribute your time more equally across all of the platforms you plan to target, ensuring that the application looks and behaves consistently everywhere. ## Platform-specific code It's likely that some part of your application's code, be it C# code or XAML markup, will be specific to only one platform - perhaps because you want to access platform-specific APIs, implement a feature using native third-party libraries, or simply customize the experience to be more idiomatic to that particular platform. You can read more on the mechanics of platform-specific code [here for C#](#Uno.Development.PlatformSpecificCSharp) and [here for XAML](#Uno.Development.PlatformSpecificXaml). You should also make sure you understand [an Uno Platform App solution structure](#Uno.Development.AppStructure). The main goals where platform-specific code is concerned are to: * **Maximize maintainability by keeping as much code shared as possible.** * **Maximize readability by organizing your code in a consistent, legible way.** Here are some tips to achieve that: * **Use [partial class](platform-specific-csharp.md#partial-class-definitions) definitions to mix shared code and platform-specific code in a single class.** Separating all platform-specific code into a dedicated partial definition is usually more readable than interleaving platform-specific `#if` blocks with shared code, particularly if the amount of platform-specific code is significant. * **Give partial definition files a platform-specific suffix.** Eg, for a `FormHighlighter` class, the shared partial definition would go in `FormHighlighter.cs`, the iOS-specific partial definition would go in `FormHighlighter.iOS.cs`, etc. * **(Optional) Consider putting platform-agnostic application layers in a separate .NET Standard project.** 'Thinking multi-platform' adds to the cognitive burden of reading and writing code, as well as the testing effort of verifying that it runs the same way on every platform. For this reason, some people prefer to split out platform-agnostic parts of the application into a separate .NET Standard project, eg 'pure' business logic which doesn't interact with the UI or with non-visual platform APIs. This project builds once as a single binary used on all platforms, giving a stronger guarantee that it will behave consistently everywhere. Enforcing that platform-agnostic separation does impose an architectural burden too, so it's a matter of personal preference. ## Application architecture You have a lot of choice when choosing an architecture for an Uno Platform application. Since it uses the WinUI contract, Uno Platform supports several features which lend themselves to a [model/view/view-model (MVVM) approach](https://learn.microsoft.com/windows/uwp/data-binding/data-binding-and-mvvm), like data binding and dependency properties; but you're perfectly free to use any approach you like best. Sometimes so much freedom can be paralyzing. To help you get started, we've created several reference applications especially for Uno Platform. These are working, real-world applications utilizing simple but effective architectural patterns for cross-platform development. * [**Ch9**](https://github.com/unoplatform/Uno.Ch9): browse content from Microsoft's publicly-available Channel 9 video feed. * [**UADO**](https://github.com/unoplatform/uado): Universal Azure DevOps Organizer ## Performance See a checklist of performance-related best practices [here](Uno-UI-Performance.md). ## Uno.UI.CommonIssues # Troubleshooting The Uno Platform features and support are constantly evolving, yet you may encounter some of the issues while building your application, for which answers and details are available below. > [!TIP] > Take a look at our [common issues list](xref:Uno.UI.CommonIssues) and [health status](https://aka.platform.uno/health-status) if you're having any troubles. > > If you are experiencing issues with Uno Platform, please visit our [GitHub Discussions](https://github.com/unoplatform/uno/discussions) or [Discord Server](https://www.platform.uno/discord) - where our engineering team and community will be able to help you. > A better resource for high-level questions about Uno Platform is the [general FAQ](#Uno.Development.FAQ). ## Hot Reload When using Hot Reload, ensure you first review the [supported features](#Uno.Features.HotReload), [supported features per OS](#Uno.Features.HotReload), and [supported features per platform](#Uno.Features.HotReload). If issues persist, additional troubleshooting information is available in [this section](#Uno.Features.HotReload). ## Development Environments - [All Development Environments](#Uno.UI.CommonIssues.AllIDEs) - [Visual Studio 2022/2026 for Windows](#Uno.UI.CommonIssues.vs2022) - [VS Code](#Uno.UI.CommonIssues.vscode) - [Rider](#Uno.UI.CommonIssues.rider) - [AI Agents](#Uno.UI.CommonIssues.AIAgents) ## Platforms - [Common issues on WebAssembly](#Uno.UI.CommonIssues.Wasm) - [Common issues on Skia (X11/macOS/Framebuffer/Windows)](#Uno.UI.CommonIssues.Skia) - [Common issues on iOS](#Uno.UI.CommonIssues.Ios) - [Common issues on Android](#Uno.UI.CommonIssues.Android) ## Build Errors - [Troubleshooting build errors](#Uno.Development.Troubleshooting) - [Build error codes](#Build.Solution.error-codes) ## Next Steps Learn more about: - You can head to [How-tos and tutorials](#Uno.Tutorials.Intro) on how to work on your Uno Platform app. - [List of views implemented in Uno](implemented-views.md) for the set of available controls and their properties. ## Uno.UI.CommonIssues.AIAgents # Issues related to AI Agents ## dnx is not a valid command The getting started for Claude, Codex and Copilot CLI use the `dnx` command, which is only available on .NET 10. If you want to use the App MCP with .NET 9 projects, you'll need to change `dnx` to `uno-devserver` and install it using `dotnet tool install -g uno.devserver`. ## The App MCP turns red in Visual Studio 2022/2026 In Visual Studio, the App MCP might turn red in some occasions. To fix this issue, click on the three dots on the right and select `Reload`. ## The uno-app MCP failed to start The Uno Platform App MCP may fail to start in Claude/Codex/Copilot CLI when it is started in a folder that does not contain an Uno Platform project. To fix this issue, change directories to a folder that contains the `.sln` or `.slnx` file of your project. ## Uno.UI.CommonIssues.AllIDEs # Issues related to all development environments ## Could not resolve SDK "Uno.Sdk" This error may happen for multiple reasons: - Make sure to update your [Uno Platform extension](https://aka.platform.uno/vs-extension-marketplace) in VS 2022 to 5.3.x or later. Earlier versions may automatically update to an incorrect version of the Uno.SDK. - Make sure to [re-run Uno.Check](#UnoCheck.UsingUnoCheck) to get all the latest dependencies. - Ensure that all [NuGet feeds are authenticated properly](https://learn.microsoft.com/nuget/consume-packages/consuming-packages-authenticated-feeds). When building on the command line, some enterprise NuGet feeds may not be authenticated properly. - Ensure that no global package mappings are interfering with nuget restore. To validate that no package mappings are set, on Windows for Visual Studio: - Make a backup copy of `%AppData%\NuGet\NuGet.Config` - Open a visual studio instance that does not have any solution opened - Go to **Tools**, **Options**, **NuGet Package Manager**, then **Package Source Mappings** - If there are entries in the list, click then click **Remove All** - Delete the `Uno.Sdk` folder in your development environment's Nuget packages `global-packages` folder: - Windows: `%userprofile%\.nuget\packages` - Mac/Linux: `~/.nuget/packages` [This folder may be overridden](https://learn.microsoft.com/en-us/nuget/consume-packages/managing-the-global-packages-and-cache-folders) using the `NUGET_PACKAGES` environment variable, the `globalPackagesFolder` or `repositoryPath` configuration settings (when using PackageReference and `packages.config`, respectively), or the `RestorePackagesPath` MSBuild property (MSBuild only). The environment variable takes precedence over the configuration setting. Try building your project again. ## Runtime error `No parameterless constructor defined for XXXX` This error is generally caused by some missing [IL Linker](https://github.com/dotnet/runtime/tree/main/src/tools/illink) configuration on WebAssembly. You may need to add some of your application assemblies in the LinkerConfig.xml file of your project. You can find [additional information in the documentation](#uno.articles.features.illinker). Similar error messages using various libraries: - `Don't know how to detect when XXX is activated/deactivated, you may need to implement IActivationForViewFetcher` (ReactiveUI) ## `Layout cycle detected` exception Layout cycle means that the measuring of a specific part of the visual tree couldn't get stabilized. For example, during an element `Arrange` pass, its measure was invalidated, then it's measured again then arranged, and the app will fall into a layout cycle. Uno Platform and WinUI run this loop for 250 iterations. If the loop hasn't stabilized, the app will fail with an exception with the message `Layout cycle detected`. For more information, see also [LayoutCycleTracingLevel in Microsoft Docs](https://learn.microsoft.com/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.debugsettings.layoutcycletracinglevel). Note that what Uno Platform logs may be quite different from what WinUI logs. This error is sometimes tricky to debug. To get more information, in your `App.OnLaunched` method, you can call `DebugSettings.LayoutCycleTracingLevel = Microsoft.UI.Xaml.LayoutCycleTracingLevel.High` in order to get additional troubleshooting information printed out in the app's logs. You will also need to update your logging to `.SetMinimumLevel(LogLevel.Trace)`, as well as add `builder.AddFilter("Microsoft.UI.Xaml.UIElement", LogLevel.Trace);` if you set the log level to high and want to get stack trace information. When the last 10 iterations out of 150 are reached, we will start logging some information as warnings. Those logs are prefixed with `[LayoutCycleTracing]` and include information such as when an element is measured or arranged, and when measure or arrange is invalidated. One possible cause of layout cycle is incorrect usage of `LayoutUpdated` event. This event isn't really tied to a specific `FrameworkElement` and is fired whenever any element changes its layout in the visual tree. So, using this event to add or remove an element to the visual tree can lead to layout cycle. The simplest example is having XAML similar to the following ```xaml ``` and code behind: ```csharp private void sp_LayoutUpdated(object sender, object e) { sp.Children.Add(new Button() { Content = "Button" }); } ``` In this case, when `LayoutUpdated` is first fired, you add a new child to the `StackPanel` which will cause visual tree root to have its measure invalidated, then `LayoutUpdated` gets fired again, causing visual tree root to have its measured invalidated again, and so on. This ends up causing a layout cycle. ## Cannot build with both Uno.WinUI and Uno.UI NuGet packages referenced This issue generally happens when referencing an Uno.UI (using WinUI APIs) NuGet package in an application that uses Uno.WinUI (Using WinAppSDK APIs). For instance, if your application has ` `Uno.WinUI` ## Abnormally long build times when using Roslyn analyzers It is a good practice to use Roslyn analyzers to validate your code during compilation, but some generators may have difficulty handling the source generated by the Uno Platform (one notable example is [GCop](https://github.com/Geeksltd/GCop)). You may need to disable those for Uno projects or get an update from the analyzer's vendor. ## Build errors with .NET workloads If you encounter errors such as: `error MSB4022: The result "" of evaluating the value "$(MonoTargetsTasksAssemblyPath)" of the "AssemblyFile" attribute in element is not valid.`, this usually indicates a problem with your .NET workloads installation. If `uno-check` does not report issues but your project still fails to build, try running: ```dotnetcli dotnet workload repair ``` This command can repair missing or misconfigured workload components. ## Uno.UI.CommonIssues.Android # Issues related to Android projects ## Insets not working when using WebView There is a known issue on Android with the [Edge-to-Edge](https://developer.android.com/develop/ui/views/layout/edge-to-edge) feature, where the bottom Insets do not function correctly when using a WebView. This flaw prevents the inputs from being shifted upward, which results in the keyboard covering them. > [!IMPORTANT] > Edge-to-Edge is enforced on devices running Android 15 with a Target SDK of 35 or higher. A workaround for this issue is to navigate to the `MainActivity.Android.cs` file in your Uno Platform application, override the `OnCreate` method, and call `WindowCompat.SetDecorFitsSystemWindows()`, setting the second parameter, decorFitsSystemWindows, to true. Your code should be structured as follows: ```csharp public class MainActivity : Microsoft.UI.Xaml.ApplicationActivity { protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); WindowCompat.SetDecorFitsSystemWindows(Window, true); } } ``` Learn more about this issue [on Google's issues tracker](https://issuetracker.google.com/issues/311256305?pli=1) website. > [!IMPORTANT] > Using the workaround mentioned above will deactivate some benefits of the Edge-To-Edge feature. For instance, your top navigation bar will no longer be "invisible," which removes the immersive appearance associated with edge-to-edge design. ## ADB0020 - The package does not support the CPU architecture of this device This error may occur when deploying an application to a physical device with ARM architecture. To resolve this issue, you will need to add the following to your csproj anywhere inside the `` tag: ```xml android-arm;android-arm64;android-x86;android-x64 ``` ## Deploying an Android app takes a long time Android deployment requires a few considerations: - Android physical device - Make sure to have a good cable (USB 3 or C) to have a good connection - Avoid debugging through wifi - Android Emulators - Use an Android x86_64 emulator. If not, [create a new one](https://learn.microsoft.com/dotnet/maui/android/emulator/device-manager). - Ensure that you have either Hyper-V or AEHD enabled. (See [Microsoft's documentation](https://learn.microsoft.com/dotnet/maui/android/emulator/hardware-acceleration)) - Try disabling `Fast Deployment` in your app configuration 1. Open your project properties 1. In the Android section, search for `Fast Deployment` 1. Uncheck all target platforms - Try setting `false` in the debug configuration of your `.csproj`. ## Android Warning XA4218 When building for Android, the following messages may happen: ```text obj\Debug\net8.0-android\android\AndroidManifest.xml : warning XA4218: Unable to find //manifest/application/uses-library at path: C:\Program Files (x86)\Android\android-sdk\platforms\android-34\optional\androidx.window.extensions.jar obj\Debug\net8.0-android\android\AndroidManifest.xml : warning XA4218: Unable to find //manifest/application/uses-library at path: C:\Program Files (x86)\Android\android-sdk\platforms\android-34\optional\androidx.window.sidecar.jar ``` Those messages are from a [known .NET for Android issue](https://github.com/xamarin/xamarin-android/issues/6809) and can be ignored as they are not impacting the build output. ## Additional troubleshooting You can get additional build [troubleshooting information here](#Uno.Development.Troubleshooting). ## Uno.UI.CommonIssues.Ios # Issues related to iOS projects ## Developing on older Mac hardware The latest macOS release and Xcode version are required to develop with Uno Platform for iOS. However, if you have an older Mac that does not support the latest macOS release, you can use a third-party tool to upgrade it, such as [OpenCore Legacy Patcher](https://dortania.github.io/OpenCore-Legacy-Patcher/). While not ideal, this can extend the use of older hardware by installing the latest macOS release on it. Please note that this method is not required when developing for other targets such as Android, Skia, WebAssembly, or Windows. ## `Don't know how to marshal a return value of type 'System.IntPtr'` [This issue](https://github.com/unoplatform/uno/issues/9430) may happen for Uno.UI 4.4.20 and later, when deploying an application using the iOS Simulator, when the application contains a `TextBox`. In order to fix this, add the following to your `.csproj`: ```xml $(MtouchExtraArgs) --registrar=static ``` ## Error while retrieving iOS device in VS code When switching to an iOS debugging target in VS Code, you might encounter an error stating that the iOS device could not be retrieved. The error message may appear as follows: ```error [Info]: Project reload forced to switch to net8.0-ios | Debug [Error] Could not retrieve ios devices within 10 seconds. Aborting... ``` To resolve this issue, download [Xcodes](https://www.xcodes.app). Inside Xcodes.app, select the correct version of Xcode and click the **Make Active** button to make it the default Xcode for your Mac. After completing this step, you can speed up the process and use the new default Xcode for simulators. On VS Code, open the Command Palette and select `Developer: Reload Window`. This should resolve the error when switching to an iOS debugging target in VS Code. ## Build stops with `Verification of iOS environment is running. Please try again in a moment` When building for an iOS physical device, the following error may happen in your build `Verification of iOS environment is running. Please try again in a moment.`. If this happens and your Visual Studio is connected to your Mac, you may need to ensure that you have selected a provisioning profile. Make sure to [configure your Apple account](https://learn.microsoft.com/en-us/dotnet/maui/ios/device-provisioning/automatic-provisioning?view=net-maui-9.0#enable-automatic-provisioning), or in some cases, selecting the development team and provisioning profile is required. ## Debugging takes a long time when connecting from a Windows machine In case your debugging experience is slow when connecting from a Windows VS environment to a Mac machine, make sure that you're not connected through Wifi on either end. Try pinging your Mac from your Windows machine and ensure it's lower than 5ms. ## Additional troubleshooting You can get additional build [troubleshooting information here](uno-builds-troubleshooting.md). ## Uno.UI.CommonIssues.MobileDebugging # Android & iOS emulators: setup & troubleshooting If Android or iOS emulators are missing or fail to start in JetBrains Rider, Visual Studio, or Visual Studio Code on macOS or Windows, use the checklists and setup paths below. ## Quick-fix checklist (do this first) - **Start the emulator manually** once, then reopen your IDE. - **Update tools & images** (Android Emulator, Platform-Tools, system images). - **Use one Android SDK location** across tools; avoid cloud-synced folders. - **Windows:** ensure virtualization is enabled (see “Windows virtualization”). - **ADB refresh:** `adb kill-server && adb start-server`, then `adb devices`. - **AVD reset:** Cold Boot or Wipe Data for a flaky AVD. - **macOS/iOS:** open the iOS Simulator from Xcode once to initialize it. - After changing SDKs, emulator images, or virtualization settings, **restart your IDE** so it refreshes its device list. ## Android emulator setup There are several common ways to manage Android Virtual Devices (AVDs): ### Option 1 — Android Studio (works with all IDEs) 1. Install the latest Android Studio. 2. **Tools → SDK Manager → SDK Tools**: update **Android Emulator** and **Android SDK Platform-Tools**. 3. **Tools → Device Manager (AVD Manager)**: create/update an AVD with a recent system image. 4. Launch the emulator, then run your Uno Platform app from your IDE. ### Option 2 — Visual Studio 1. Install Visual Studio 2022/2026 with the **Multi-Platform App UI development with .NET** workload. 2. Open **Tools → Android → Android Device Manager**. 3. Create/update an AVD and start it before you deploy from your IDE. ### Option 3 — JetBrains Rider 1. Install **Rider** and the **Android Support** plugin via **Preferences/Settings → Plugins → Marketplace**. 2. From Rider’s Device/AVD Manager, create/update an AVD (you can reuse AVDs made in Android Studio). 3. If Rider doesn’t list it immediately, start the AVD manually and restart Rider. ### Option 4 — Visual Studio Code > VS Code doesn’t include a built-in AVD manager. It **uses AVDs created by Android Studio, Rider, or Visual Studio** and can start them via extensions or the terminal. 1. **Install/verify Android SDK & tools** - Create AVDs in **Android Studio** (recommended) or another IDE. - Ensure command-line tools are available in your `PATH` (e.g., `/platform-tools` and `/emulator`). - Optional: confirm the .NET Android workload is present: `dotnet workload list` (look for `android`). 2. **Start an emulator** - Use an extension (e.g., an “Android/iOS Emulator” helper) to start/stop AVDs from the Command Palette, **or** - Use the terminal: ```bash emulator -list-avds emulator -avd adb devices ``` 3. **Make VS Code see the device** - **Reload Window** after the emulator starts, or restart VS Code. - If the emulator isn’t listed, verify `adb devices` shows it, then relaunch the debugger. 4. **Troubleshooting in VS Code** - Ensure `ANDROID_SDK_ROOT` (or `ANDROID_HOME`) points to the correct SDK. - Keep only **one** SDK location across tools to avoid a mismatch. - If an extension can’t find the emulator, set the SDK/emulator path in its settings. --- ## Windows virtualization (required for fast Android emulation) Enable **Windows Hypervisor Platform** (and **Hyper-V** on supported editions), then **reboot**. Avoid conflicts with other hypervisors (e.g., VirtualBox in non-Hyper-V mode). ## iOS simulator setup (macOS only) 1. Install the latest **Xcode** from the App Store and launch it once to accept the license. 2. Verify the Simulator runs: **Xcode → Window → Devices and Simulators**. 3. If your IDE can’t find the Simulator, **start it manually** or **reboot**. 4. Inspect available simulators: ```bash xcrun simctl list devices ``` ## SDK location - Keep your **Android SDK** and **AVD** directories **outside** cloud-sync folders (OneDrive/iCloud/Dropbox) to avoid file-locking and partial syncs. - Verify or change the SDK path in **Android Studio**: - **macOS:** *Preferences → Appearance & Behavior → System Settings → Android SDK* - **Windows/Linux:** *File → Settings → Appearance & Behavior → System Settings → Android SDK* - Use a **single SDK location** across all tools (Android Studio, Rider, VS/VS Code). - Set environment variables so CLIs and IDEs agree: - **`ANDROID_SDK_ROOT`** (recommended) or **`ANDROID_HOME`** (legacy). - Typical locations: - **macOS:** `~/Library/Android/sdk` - **Windows:** `%LOCALAPPDATA%\Android\Sdk` (or a custom `C:\Android\Sdk`) - **Linux:** `~/Android/Sdk` - **AVDs:** `~/.android/avd` (macOS/Linux) or `%USERPROFILE%\.android\avd` (Windows) - After moving or changing SDKs/AVDs, **restart your IDE** so it refreshes device lists. ## Uno.UI.CommonIssues.rider # Issues related to Rider You can view the [list of known issues in Rider's bug tracker](https://github.com/unoplatform/uno/issues/15226). ## Uno.UI.CommonIssues.Skia # Issues related to Skia-based projects ## System.DllNotFoundException: Gtk: libgtk-3-0.dll When running the Skia.GTK project head, the following error may happen: ```console Unhandled exception. System.TypeInitializationException: The type initializer for 'Gtk.Application' threw an exception. ---> System.DllNotFoundException: Gtk: libgtk-3-0.dll, libgtk-3.so.0, libgtk-3.0.dylib, gtk-3.dll ``` ## Linux ## [**Ubuntu 20.04/22.04**](#tab/ubuntu2004) - Install the required dependencies: ```bash sudo apt update sudo apt install mesa-utils libgl1-mesa-glx ttf-mscorefonts-installer dbus libfontconfig1 libxrandr2 libxi-dev ``` ## [**ArchLinux 5.8.14 or later / Manjaro**](#tab/archlinux2004) - Update system and packages ```bash pacman -Syu ``` - Install the necessary dependencies ```bash sudo pacman -S dotnet-targeting-pack dotnet-sdk dotnet-host dotnet-runtime python ninja gn aspnet-runtime dbus libxrandr libxi ``` --- You may also need to [install the Microsoft fonts](https://wiki.archlinux.org/title/Microsoft_fonts) manually. If you are using Windows Subsystem for Linux (WSL), you can find specific instructions in the following video: > [!Video https://www.youtube-nocookie.com/embed/GGszH8PDf-w] ## Additional troubleshooting You can get additional build [troubleshooting information here](uno-builds-troubleshooting.md). ## Uno.UI.CommonIssues.vs2022 # Issues related to Visual Studio 2022/2026 ## Unable to select the `MyApp (Unpackaged WinAppSDK)` profile A [Visual Studio issue](https://developercommunity.visualstudio.com/t/WinAppSDK-Unpackaged-profile-cannot-be-s/10643735) is preventing the Unpackaged profile if iOS/Android target frameworks are present in the project. In order for the unpackaged profile to be selected, you'll need to edit the `Properties/launchSettings.json` file to remove the `MyApp (Packaged WinAppSDK)` entry. Once it is removed, select the `MyApp (Unpackaged WinAppSDK)` then start the debugging of your app. ## An iOS fails to run with `No class inheriting from a valid Application Delegate found` When using iOS Hot Restart on Visual Studio 2022/2026, a [limitation of the environment](https://developercommunity.visualstudio.com/t/iOS-Hot-Restart-does-not-work-for-non-MA/10714660) prevents an Uno Platform app from starting properly when MAUI Embedding is referenced. A workaround is to disable MAUI Embedding in the [`UnoFeatures` of your project](#Uno.Features.Uno.Sdk). ## App builds in Visual Studio 2022/2026 are taking a long time Take a [look at our article](#Build.Solution.TargetFramework-override) in order to ensure that your solution is building and showing intellisense as fast as possible, and to avoid [this Visual Studio issue](https://developercommunity.visualstudio.com/t/Building-a-cross-targeted-project-with-m/651372?space=8&q=building-a-cross-targeted-project-with-many-target) (help the community by upvoting it!) where multi-targeted project libraries always build their full set of targets. ## My app is not running as fast as I want There could be many reasons for being in this situation, but we've built a list of performance tips in [this article](#Uno.Development.Performance) that you can apply to your app. If you haven't found your answer, open a [discussion](https://github.com/unoplatform/uno/discussions) to tell us about it! ## C# Hot Reload troubleshooting C# Hot Reload is provided by Visual Studio 2022/2026, and there may be occasions where updates are not applied, or the modified code is incorrectly reported as not compiling. If that is the case: - Make sure that the top left selector in the C# editor is showing the project head being debugged. For instance, if debugging with `net9.0-desktop`, select the `net9.0-desktop` project. - Try recompiling the application completely (with the `Rebuild` command) More troubleshooting information is available [in this section](#Uno.Features.HotReload). ## error NETSDK1148: A referenced assembly was compiled using a newer version of Microsoft.Windows.SDK.NET.dll See [this article](features/winapp-sdk-specifics.md#adjusting-windows-sdk-references) to solve this issue. ### My application does not start under WSL Your application may fail to run under WSL for multiple reasons: - Your app is in a path that contains spaces and/or characters such as `[` or `]` - [WSLg](#Uno.GetStarted.vs2022) has not been installed - [X11 dependencies](#Uno.GetStarted.vs2022) have not been installed ### New Projects in Existing Solutions Creating a new Uno Platform project inside an existing solution that wasn’t originally created with “Place solution and project in the same directory” is not supported by the `unoapp` templates. You can work around this by following the guide: [Adding Platforms to an Existing Project](#Uno.Guides.AddAdditionalPlatforms). ## Legacy issues ### The XAML editor shows `The type 'page' does not support direct content` message This issue has been fixed in Visual Studio 17.8 and later. If you're using an earlier version, XAML Intellisense [is not working properly](https://developercommunity.visualstudio.com/content/problem/587980/xaml-intellisense-does-not-use-contentpropertyattr.html) in Visual Studio when the active target framework is not the WinAppSDK one. To work around this issue, close all XAML editors, open a C# file and select the '[MyApp].Windows' in the top-left drop-down list of the text editor sector. Once selected, re-open the XAML file. ### `InitializeComponent` or `x:Name` variable is not available in code-behind This issue has been fixed in Visual Studio 17.8 and later. If you're using an earlier version, Visual Studio [does not refresh the intellisense cache](https://developercommunity.visualstudio.com/content/problem/588021/the-compile-itemgroup-intellisense-cache-is-not-re.html) properly, causing variables to be incorrectly defined. To fix this issue, build your project once, close the solution and reopen it. It is also important to note that Uno Platform uses a multi-project structure, for which each project has to be build individually for errors to disappear from the **Error List** window (notice the **Project** column values). In order to clear the **Error List** window, build the whole solution completely once. Thereafter, build a specific project and prefer the use of the **Output** tool window (in the menu **View** -> **Output**), taking build messages by order of appearance. ### Event handler cannot be added automatically Event handlers [cannot be automatically](https://github.com/unoplatform/uno/issues/1348#issuecomment-520300471) added using the XAML editor. A workaround is to use the [`x:Bind` to events feature](features/windows-ui-xaml-xbind.md#examples). This feature allows to use a simpler syntax like ` ``` #### [**Full Code**](#tab/code) ##### Full C# Markup code - Example of the complete code on the MainPage.cs, so you can follow along in your own project. ```csharp using Microsoft.UI; using Microsoft.UI.Text; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Media.Imaging; using MySampleProject.Model; using MySampleProject.ViewModel; using System; namespace MySampleProject; public sealed partial class MainPage : Page { public MainPage() { //Create an ViewModel that load a list of samples DataContext = new ViewModelSample(); //Set a ViewModel to the DataContext this.DataContext((page, vm) => page .Background(ThemeResource.Get("ApplicationPageBackgroundThemeBrush")) //Set Resources using C# Markup .Resources ( r => r .Add("Icon_Create", "F1 M 0 10.689374307777618 L 0 13.501874923706055 L 2.8125 13.501874923706055 L 11.107499599456787 5.206874544314932 L 8.295000314712524 2.394375001270064 L 0 10.689374307777618 Z M 13.282499313354492 3.03187490723031 C 13.574999302625656 2.7393749282891826 13.574999302625656 2.266875037959408 13.282499313354492 1.97437505901828 L 11.527500629425049 0.21937498420584567 C 11.235000640153885 -0.07312499473528189 10.762499302625656 -0.07312499473528189 10.469999313354492 0.21937498420584567 L 9.097500085830688 1.591874900865419 L 11.909999370574951 4.404374801538142 L 13.282499313354492 3.03187490723031 L 13.282499313354492 3.03187490723031 Z") .Add("Icon_Delete", "F1 M 0.75 12 C 0.75 12.825000017881393 1.4249999821186066 13.5 2.25 13.5 L 8.25 13.5 C 9.075000017881393 13.5 9.75 12.825000017881393 9.75 12 L 9.75 3 L 0.75 3 L 0.75 12 Z M 10.5 0.75 L 7.875 0.75 L 7.125 0 L 3.375 0 L 2.625 0.75 L 0 0.75 L 0 2.25 L 10.5 2.25 L 10.5 0.75 Z") ) .Content( new Grid() .Style(GetGridStyle()) .RowDefinitions("Auto, *") .ColumnDefinitions("2*, Auto, 2*") .Background(new SolidColorBrush(Colors.Silver)) .Margin(50) .Children( new TextBlock() .Style( new Style() .Setters(e => e.Padding(50)) ) .Text("Welcome!!") .Grid(row: 0, column: 0), new Image() .Source(new BitmapImage(new Uri("https://picsum.photos/366/366"))) .Stretch(Stretch.UniformToFill) .Width(70) .Height(70) .Margin(0,0,50,0) .Grid(row: 0, column: 2) .HorizontalAlignment(HorizontalAlignment.Right), new Grid() .Style(GetGridStyle()) .ColumnDefinitions("*, *, *") .Background(new SolidColorBrush(Color.FromArgb(255, 233, 233, 233))) .Grid(grid => grid.Row(1).ColumnSpan(3)) .Children( new StackPanel() .Orientation(Orientation.Vertical) .Grid(grid => grid.Column(0)) .Children( //C# Markup easily allows code reuse, as shown below. GetReusedCodeForTitle("Basics Bindings", "Direct Attribute"), new TextBlock() .Margin(0, 20, 0, 0) .Text("Bind") .FontSize(14) .FontWeight(FontWeights.Bold), //Setting some Binding new TextBlock() .Text(x => x.Bind(() => vm.DirectAttribute)), new TextBlock() .Margin(0, 20, 0, 0) .Text("Short Bind") .FontSize(14) .FontWeight(FontWeights.Bold), //Setting some Binding using the shorthand version new TextBlock() .Text(() => vm.DirectAttribute), new TextBlock() .Margin(0, 20, 0, 0) .Text("Named Bind") .FontSize(14) .FontWeight(FontWeights.Bold), //Setting some Binding using a Path string new TextBlock() .Text(x => x.Bind("DirectAttribute")) ), new StackPanel() .Grid(grid => grid.Column(1)) .Orientation(Orientation.Vertical) .Children( GetReusedCodeForTitle("GridView", "Using Binding"), //Using GridView to display information using Binding the ItemsSource and using ItemTemplate. //Notice how simple it is to use templates in C# Markup. new GridView() .Grid(row: 1, columnSpan: 2)//Attached Properties .ItemsSource(x => x.Bind(() => vm.SampleList)) .ItemTemplate((sample) => GetDataTemplate()) ), new StackPanel() .Grid(grid => grid.Column(2)) .Orientation(Orientation.Vertical) .Children( GetReusedCodeForTitle("ListView", "Using ItemTemplateSelector"), //Using ListView to display information using ItemTemplateSelector to customize the layout. new ListView() .ItemsSource(x => x.Bind(() => vm.SampleList)) .ItemTemplateSelector((item, selector) => selector .Case(v => v.Active, () => GetDataTemplateActive()) .Case(v => !v.Active, () => GetDataTemplateInative()) .Default(() => new TextBlock().Text("Some Sample")) ) ) ) ) )); } //Using Template public StackPanel GetDataTemplate() { return new StackPanel() .Orientation(Orientation.Horizontal) .Children( new TextBlock().Margin(10).Text(x => x.Bind("Name")), new TextBlock().Margin(10).Text(x => x.Bind("Description")), new TextBlock() .Margin(10) .Text(x => x.Bind("Active")) ); } //Using Template public StackPanel GetDataTemplateInative() { return new StackPanel().Orientation(Orientation.Horizontal).Children( new TextBlock().Margin(10).Text(x => x.Bind("Name")), new TextBlock().Margin(10).Text(x => x.Bind("Description")), new Button() .Content(new PathIcon().Data(StaticResource.Get("Icon_Delete"))) ); } public StackPanel GetDataTemplateActive() { return new StackPanel().Orientation(Orientation.Horizontal).Children( new TextBlock().Margin(10).Text(x => x.Bind("Name")), new TextBlock().Margin(10).Text(x => x.Bind("Description")), new Button() .Content(new PathIcon().Data(StaticResource.Get("Icon_Create"))) ); } //Using Style public Style GetGridStyle() { return new Style() .Setters(s => s.Padding(50)) .Setters(s => s.BorderBrush(new SolidColorBrush(Colors.Blue))) .Setters(s => s.BorderThickness(1)) .Setters(s => s.CornerRadius(30)); } public StackPanel GetReusedCodeForTitle(string Title, string SubTitle) { return new StackPanel().Children( new TextBlock() .Text(Title) .FontSize(18) .FontWeight(FontWeights.Bold) .Name(out var searchText), new TextBlock() .Text(SubTitle) .FontSize(16) .FontWeight(FontWeights.Bold) ); } } ``` ## All Code - Now you can check the full code using C# Markup and XAML. ### [**Full XAML Code**](#tab/cli) #### Full XAML code - Example of the complete code on the MainPage.xaml, so you can follow along in your own project. ```xml F1 M 0 10.689374307777618 L 0 13.501874923706055 L 2.8125 13.501874923706055 L 11.107499599456787 5.206874544314932 L 8.295000314712524 2.394375001270064 L 0 10.689374307777618 Z M 13.282499313354492 3.03187490723031 C 13.574999302625656 2.7393749282891826 13.574999302625656 2.266875037959408 13.282499313354492 1.97437505901828 L 11.527500629425049 0.21937498420584567 C 11.235000640153885 -0.07312499473528189 10.762499302625656 -0.07312499473528189 10.469999313354492 0.21937498420584567 L 9.097500085830688 1.591874900865419 L 11.909999370574951 4.404374801538142 L 13.282499313354492 3.03187490723031 L 13.282499313354492 3.03187490723031 Z F1 M 0.75 12 C 0.75 12.825000017881393 1.4249999821186066 13.5 2.25 13.5 L 8.25 13.5 C 9.075000017881393 13.5 9.75 12.825000017881393 9.75 12 L 9.75 3 L 0.75 3 L 0.75 12 Z M 10.5 0.75 L 7.875 0.75 L 7.125 0 L 3.375 0 L 2.625 0.75 L 0 0.75 L 0 2.25 L 10.5 2.25 L 10.5 0.75 Z ``` ### [**Full C# Markup Code**](#tab/code) #### Full C# Markup code - Example of the complete code on the MainPage.cs, so you can follow along in your own project. ```csharp using Microsoft.UI; using Microsoft.UI.Text; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Media.Imaging; using MySampleProject.Model; using MySampleProject.ViewModel; using System; namespace MySampleProject; public sealed partial class MainPage : Page { public MainPage() { //Create an ViewModel that load a list of samples DataContext = new ViewModelSample(); //Set a ViewModel to the DataContext this.DataContext((page, vm) => page .Background(ThemeResource.Get("ApplicationPageBackgroundThemeBrush")) //Set Resources using C# Markup .Resources ( r => r .Add("Icon_Create", "F1 M 0 10.689374307777618 L 0 13.501874923706055 L 2.8125 13.501874923706055 L 11.107499599456787 5.206874544314932 L 8.295000314712524 2.394375001270064 L 0 10.689374307777618 Z M 13.282499313354492 3.03187490723031 C 13.574999302625656 2.7393749282891826 13.574999302625656 2.266875037959408 13.282499313354492 1.97437505901828 L 11.527500629425049 0.21937498420584567 C 11.235000640153885 -0.07312499473528189 10.762499302625656 -0.07312499473528189 10.469999313354492 0.21937498420584567 L 9.097500085830688 1.591874900865419 L 11.909999370574951 4.404374801538142 L 13.282499313354492 3.03187490723031 L 13.282499313354492 3.03187490723031 Z") .Add("Icon_Delete", "F1 M 0.75 12 C 0.75 12.825000017881393 1.4249999821186066 13.5 2.25 13.5 L 8.25 13.5 C 9.075000017881393 13.5 9.75 12.825000017881393 9.75 12 L 9.75 3 L 0.75 3 L 0.75 12 Z M 10.5 0.75 L 7.875 0.75 L 7.125 0 L 3.375 0 L 2.625 0.75 L 0 0.75 L 0 2.25 L 10.5 2.25 L 10.5 0.75 Z") ) .Content( new Grid() .Style(GetGridStyle()) .RowDefinitions("Auto, *") .ColumnDefinitions("2*, Auto, 2*") .Background(new SolidColorBrush(Colors.Silver)) .Margin(50) .Children( new TextBlock() .Style( new Style() .Setters(e => e.Padding(50)) ) .Text("Welcome!!") .Grid(row: 0, column: 0), new Image() .Source(new BitmapImage(new Uri("https://picsum.photos/366/366"))) .Stretch(Stretch.UniformToFill) .Width(70) .Height(70) .Margin(0,0,50,0) .Grid(row: 0, column: 2) .HorizontalAlignment(HorizontalAlignment.Right), new Grid() .Style(GetGridStyle()) .ColumnDefinitions("*, *, *") .Background(new SolidColorBrush(Color.FromArgb(255, 233, 233, 233))) .Grid(grid => grid.Row(1).ColumnSpan(3)) .Children( new StackPanel() .Orientation(Orientation.Vertical) .Grid(grid => grid.Column(0)) .Children( //C# Markup easily allows code reuse, as shown below. GetReusedCodeForTitle("Basics Bindings", "Direct Attribute"), new TextBlock() .Margin(0, 20, 0, 0) .Text("Bind") .FontSize(14) .FontWeight(FontWeights.Bold), //Setting some Binding new TextBlock() .Text(x => x.Bind(() => vm.DirectAttribute)), new TextBlock() .Margin(0, 20, 0, 0) .Text("Short Bind") .FontSize(14) .FontWeight(FontWeights.Bold), //Setting some Binding using the shorthand version new TextBlock() .Text(() => vm.DirectAttribute), new TextBlock() .Margin(0, 20, 0, 0) .Text("Named Bind") .FontSize(14) .FontWeight(FontWeights.Bold), //Setting some Binding using a Path string new TextBlock() .Text(x => x.Bind("DirectAttribute")) ), new StackPanel() .Grid(grid => grid.Column(1)) .Orientation(Orientation.Vertical) .Children( GetReusedCodeForTitle("GridView", "Using Binding"), //Using GridView to display information using Binding the ItemsSource and using ItemTemplate. //Notice how simple it is to use templates in C# Markup. new GridView() .Grid(row: 1, columnSpan: 2)//Attached Properties .ItemsSource(x => x.Bind(() => vm.SampleList)) .ItemTemplate((sample) => GetDataTemplate()) ), new StackPanel() .Grid(grid => grid.Column(2)) .Orientation(Orientation.Vertical) .Children( GetReusedCodeForTitle("ListView", "Using ItemTemplateSelector"), //Using ListView to display information using ItemTemplateSelector to customize the layout. new ListView() .ItemsSource(x => x.Bind(() => vm.SampleList)) .ItemTemplateSelector((item, selector) => selector .Case(v => v.Active, () => GetDataTemplateActive()) .Case(v => !v.Active, () => GetDataTemplateInative()) .Default(() => new TextBlock().Text("Some Sample")) ) ) ) ) )); } //Using Template public StackPanel GetDataTemplate() { return new StackPanel() .Orientation(Orientation.Horizontal) .Children( new TextBlock().Margin(10).Text(x => x.Bind("Name")), new TextBlock().Margin(10).Text(x => x.Bind("Description")), new TextBlock() .Margin(10) .Text(x => x.Bind("Active")) ); } //Using Template public StackPanel GetDataTemplateInative() { return new StackPanel().Orientation(Orientation.Horizontal).Children( new TextBlock().Margin(10).Text(x => x.Bind("Name")), new TextBlock().Margin(10).Text(x => x.Bind("Description")), new Button() .Content(new PathIcon().Data(StaticResource.Get("Icon_Delete"))) ); } public StackPanel GetDataTemplateActive() { return new StackPanel().Orientation(Orientation.Horizontal).Children( new TextBlock().Margin(10).Text(x => x.Bind("Name")), new TextBlock().Margin(10).Text(x => x.Bind("Description")), new Button() .Content(new PathIcon().Data(StaticResource.Get("Icon_Create"))) ); } //Using Style public Style GetGridStyle() { return new Style() .Setters(s => s.Padding(50)) .Setters(s => s.BorderBrush(new SolidColorBrush(Colors.Blue))) .Setters(s => s.BorderThickness(1)) .Setters(s => s.CornerRadius(30)); } public StackPanel GetReusedCodeForTitle(string Title, string SubTitle) { return new StackPanel().Children( new TextBlock() .Text(Title) .FontSize(18) .FontWeight(FontWeights.Bold) .Name(out var searchText), new TextBlock() .Text(SubTitle) .FontSize(16) .FontWeight(FontWeights.Bold) ); } } ``` ## Next Steps - [Custom your own C# Markup - Learn how to change Visual States and User Controls](#Uno.Extensions.HowToCustomMarkupProjectVisualStates) - [Custom your own C# Markup - Learn how to use Toolkit](#Uno.Extensions.HowToCustomMarkupProjectToolkit) - [Custom your own C# Markup - Learn how to Change the Theme](#Uno.Extensions.HowToCustomMarkupProjectTheme) - [Custom your own C# Markup - Learn how to use MVUX](#Uno.Extensions.HowToCustomMarkupProjectMVUX) ## Uno.Extensions.Markup.HowToCustomMarkupProjectMVUX # How to set up your own C# Markup project using MVUX You can use this tutorial to learn how to set up a Uno Platform project using MVUX. Create a new project using MVUX - In this tutorial, you will [set up the environment and create the Markup project and MVUX](#Uno.Extensions.HowToMarkupMVUX) ## Start With MVUX The MVUX provides a structured approach to managing the application state and updating the user interface within the Uno Platform, following the principles of MVU architecture. It aims to simplify state management and UI development by providing abstractions and conventions for working with feeds, states, and views. In this tutorial, you can learn about the [MVUX](#Uno.Extensions.Mvux.Overview) using XAML. The same concept can be applied to C# Markup. By the way, let's use the same existing example in XAML to make the conversation in C# Markup. Let's try to simplify the use to be able to explain the features. ### WeatherApp Sample XAML You can find the code for our weather app here: https://github.com/unoplatform/Uno.Samples/tree/master/UI/MvuxHowTos/WeatherApp ### Add elements and set attributes on the UI Change the *MainPage* to have a different content as the sample bellow. - Customizing the UI #### [**C# Markup**](#tab/cs) ##### C# Markup - The code below shows how to use the FeedView to list information on MVUX. But first to have the information we will create the WeatherModel and the WeatherService. First, let's create the Weather Service. Create a class file named `WeatherService.cs` and add the content below to the file. In this File we will create a record WeatherInfo with contains the attribute Temperature. After that, we create an IWeatherService, (With defining the GetCurrentWeather) and an implementation of it on the WeatherService. For this case, just have a new WeatherInfo with a random temperature. > Notice that the WeatherInfo is been created for every new request, following the MVU standard. ```csharp namespace MySampleProjectMVUX; public partial record WeatherInfo(int Temperature); public interface IWeatherService { ValueTask GetCurrentWeather(CancellationToken ct); } public class WeatherService : IWeatherService { public async ValueTask GetCurrentWeather(CancellationToken ct) { await Task.Delay(TimeSpan.FromSeconds(1), ct); return new WeatherInfo(new Random().Next(-40, 40)); } } ``` Next, let's create the Model. Create a class file named `WeatherModel.cs` and add the content below to the file. In this case, we are creating a `WeatherModel` which contains an `IFeed` of the `WeatherInfo`. ```csharp namespace MySampleProjectMVUX; using Uno.Extensions.Reactive; public partial record WeatherModel(IWeatherService WeatherService) { public IFeed CurrentWeather => Feed.Async(WeatherService.GetCurrentWeather); } ``` And now we need to add the DataContext to the Page. > Notice that we are using the class WeatherViewModel auto generated by the MVUX. ```csharp this.DataContext = new WeatherViewModel(new WeatherService()); this.DataContext((page, vm) => page ); ``` And after that add the FeedView. ```csharp new FeedView() .Source(() => vm.CurrentWeather) //.Source(x => x.Bind(() => vm.CurrentWeather)) //You can use the Function .DataTemplate((sample) => GetDataTemplate()) //Or you can use direct the Element .ProgressTemplate((sample) => new StackPanel().Children( new TextBlock().Text("Loading...") ) ) ``` #### [**XAML**](#tab/cli) ##### XAML MainPage.xaml ```xml ``` During the execution of the `Save` method, the `Button` will automatically be disabled, making it clear that the method is running. ## Command generation By default, MVUX will generate a command in the ViewModel for each public method in a Model via [**Implicit command generation**](#implicit-command-generation). This behavior can be customized using attributes, or alternatively, can be disabled in favor of [**Explicit command creation**](#explicit-command-creation). ### Implicit command generation #### Basic commands By default, a command property will be generated in the ViewModel for each method on the Model that has no return value or is asynchronous (e.g. returns `ValueTask` or `Task`). The asynchronous method on the Model may take a single `CancellationToken` parameter, which will be cancelled if the ViewModel is disposed of whilst commands are running. Although a `CancellationToken` parameter is not mandatory, it's a good practice to add one, as it enables the cancellation of the asynchronous operation. For example, if the Model contains a method in any of the following signatures: 1. A method without a return value: ```csharp public void DoWork(); ``` 1. A method returning `ValueTask`, with a `CancellationToken` parameter: ```csharp public ValueTask DoWork(CancellationToken ct); ``` 1. A method returning `ValueTask`, without a `CancellationToken` parameter: ```csharp public ValueTask DoWork(); ``` a `DoWork` command will be generated in the ViewModel: ```csharp public IAsyncCommand DoWork { get; } ``` In some scenarios, you may need to use the method only, without a command generated for it. You can use the [`ImplicitCommands` attribute](#implicitcommands-attribute) to switch off or back on command generation for certain methods, classes, or assemblies. For example, in this code, the `ImplicitCommand` attribute has been used to disable the creation of the command for the `DoWork` method. ```csharp [ImplicitCommand(false)] public ValueTask DoWork(); ``` When command generation is switched off, the methods under the scope which has been switched off will be generated in the ViewModel as regular methods rather than as commands, meaning that they are still available to be data-bound or invoked via the ViewModel. #### Using the CommandParameter An additional parameter can be added to the method on the Model, which is then assigned with the value of the `CommandParameter` received from the View. For example, when a `Button` is clicked, the [`Button.CommandParameter`](https://learn.microsoft.com/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.primitives.buttonbase.commandparameter) value will be passed to the command. The `CommandParameter` value is first passed to the `CanExecute` method on the command to determine if the command can be executed. The command checks both that the `CommandParameter` value can be cast to the correct type, and that there's not already an invocation of the command for that `CommandParameter` value. Assuming `CanExecute` returns true, when the `Button` is clicked the `Execute` method on the command is invoked which routes the call, including the `CommandParameter` value (correctly cast to the appropriate type), to the method on the Model. In this example the Model defines a method, `DoWork`, that accepts a parameter, `param`: ```csharp public void DoWork(double param) { ... } ``` The corresponding command in the ViewModel looks the same as before. However, the implementation, which you can inspect in the generated code, includes logic to validate the type of the `CommandParameter`, and subsequently passes the cast value to the `DoWork` method on the Model: ```csharp public IAsyncCommand DoWork { get; } ``` The command can be consumed in the View by setting the `CommandParameter` on the Button. In this case, the value is data bound to the `Value` property on the `Slider`: ```xml ``` #### ImplicitFeedCommandParameter attribute You can opt-in or opt-out of implicit matching of Feeds and command parameters by decorating the current assembly or class with the [`ImplicitFeedCommandParameters`](https://github.com/unoplatform/uno.extensions/blob/main/src/Uno.Extensions.Reactive/Config/ImplicitFeedCommandParametersAttribute.cs) attribute: ```csharp [assembly:ImplicitFeedCommandParameter(false)] [ImplicitFeedCommandParameter(true)] public partial record MyModel ``` #### FeedParameter attribute You can also explicitly match a parameter with a Feed even if the names don't match. Decorate the parameter with the [`FeedParameter`](https://github.com/unoplatform/uno.extensions/blob/main/src/Uno.Extensions.Reactive/Presentation/Commands/FeedParameterAttribute.cs) attribute to explicitly match a parameter with a Feed: ```csharp public IFeed Message { get; } public async ValueTask Share([FeedParameter(nameof(Message))] string msg) { ... } ``` `ImplicitFeedCommandParameter` and `FeedParameter` attributes can also be nested to enable or disable specific scopes in the app. The `FeedParameter` setting has priority over `ImplicitFeedCommandParameter`, so parameters decorated with `FeedParameter` will explicitly indicate that the parameter is to be fulfilled by a Feed. ### Using XAML behaviors to execute a command when an event is raised You can also utilize MVUX's generated commands and invoke them when an event is raised. This can be achieved with the [XamlBehaviors](https://github.com/unoplatform/Uno.XamlBehaviors) library (Nuget packages [Uno.Microsoft.Xaml.Behaviors.Interactivity.WinUI](https://www.nuget.org/packages/Uno.Microsoft.Xaml.Behaviors.Interactivity.WinUI) and [Uno.Microsoft.Xaml.Behaviors.WinUI.Managed](https://www.nuget.org/packages/Uno.Microsoft.Xaml.Behaviors.WinUI.Managed)). For example, if you want to capture a `TextBlock` being double-tapped, you can add in the Model a method to be invoked on that event: ```csharp public void TextBlockDoubleTapped(string text) { ... } ``` The `TextBlockDoubleTapped` method will be generated as a command, which you can then use XAML behaviors to invoke when the `TextBlock`'s `DoubleTapped` event occurs. You can also pass its command parameter to the method (although you can choose to omit it): ```xml ``` When the `TextBlock` is double-tapped (or double-clicked), the `TextBlockDoubleTapped` command which is generated in the ViewModel will be executed, and in turn, the `TextBlockDoubleTapped` method in the Model will be invoked. The text 'Double-tap me' will be passed in as the command parameter. ### Explicit command creation Adding commands via code generation is sufficient enough to cover most scenarios. However, sometimes you may need to have more control over the command creation, which is where explicit command creation is useful. Commands can be created manually using the static class [`Command`](https://github.com/unoplatform/uno.extensions/blob/main/src/Uno.Extensions.Reactive/Presentation/Commands/Command.cs), which provides factory methods for creating commands. #### Command.Async factory method The `Async` utility method takes an `AsyncAction` callback as its parameter. An `AsyncAction` refers to an asynchronous method that has a `CancellationToken` as its last parameter (preceded by any other parameters), and returns a `ValueTask`. ```csharp public ICommand MyCommand => Command.Async(async(ct) => await PingServer(ct)); ``` In the above example, `PingServer` is of the following signature: ```csharp ValueTask PingServer(CancellationToken ct); ``` The `Command.Async` method will create a command that when executed will run the `PingServer` method asynchronously. #### Create & Create\ You can use the `Command.Create` factory methods to create a command. The `Command.Create` provides an `ICommandBuilder` parameter, which you can use to configure the command in a fluent API fashion. This API is intended for Uno Platform's internal use but can be useful if you need to create custom commands. `ICommandBuilder` provides the three methods below. - ##### Given This method initializes a command from a Feed (or a State). The command will be triggered whenever a new value is available to the Feed. It takes a single `IFeed` parameter. ```csharp public IFeed PageCount => ... public IAsyncCommand MyCommand => Command.Create(builder => builder.Given(PageCount)); ``` - ##### When Defines the 'can execute' of the command. It accepts a predicate of `T`, where `T` is the type the command has been created with. When this is configured, the command will be executed only if the condition is true. ```csharp public IAsyncCommand MyCommand => Command.Create(builder => builder.When(i => i > 10)); ``` In the above example, the predicate passed into the `When` method will be executed when the UI wants to determine if the command can be executed, which will only happen when the command parameter is greater than 10. - ##### Then This method sets the asynchronous callback to be invoked when the Command is executed. If there's a preceding parameter setting (via `Given` or `When`), it will be generic. ```csharp public IAsyncCommand MyCommand => Command.Create(builder => builder.Then(async ct => await ExecuteMyCommand(ct))); public ValueTask ExecuteMyCommand(CancellationToken ct) { ... } ``` You can use the `Execute` instead of `Then`. These are just aliases of each other. #### Example Here's a complete example of how `MyCommand` is defined in the Model. ```csharp public IAsyncCommand MyCommand => Command.Create(builder => builder .Given(CurrentPage) .When(currentPage => currentPage > 0) .Then(async (currentPage, ct) => await NavigateToPage(currentPage, ct))); public IFeed CurrentPage => ... public ValueTask NavigateToPage(int currentPage, CancellationToken ct) { ... } ``` As with implicitly created commands, the `Command` property on UI controls, such as a `Button`, can be bound to the command, `MyCommand`. However, since commands created using the fluent API are not replicated on the ViewModel, the binding expression has to include the ViewModel's `Model` property to access the Model instance. ```xml ``` ![Material - Button lightweight styling](assets/material-lightweight-styling-anatomy.png) Lightweight Styling allows for fine-grained control over the look of your UI components across all visual states. All interactive controls have multiple states, such as **PointerOver** (mouse is hovered over), **Pressed** (control is pressed on), and **Disabled** (control is not interactable). These states are appended onto the endings of the resource keys: ButtonForeground*PointerOver*, ButtonForeground*Pressed*, and ButtonForeground*Disabled*. Combined with these, the `CheckBox` and `RadioButton` controls also have **Checked** and **Unchecked** states. This means that it is possible to customize the appearance of your Uno Material-styled controls across any visual state without the need to redefine the style. As an example, the XAML below defines three Buttons, all using FilledButtonStyle from Uno Material: 1. A Default Button with no changes 2. A Button with several brush resources overridden for the **Normal** visual state 3. A Button that overrides resources that are used with FilledButtonStyle's **PointerOver** visual state ```xml ``` With this XAML, we are given the following visual result, notice the third Button has a new `BorderThickness` applied and takes on different colors while in the **PointerOver** state. ![Material - Button lightweight styling](assets/material-button-pointerover-lightweight-styling.png) ## C# Markup All Lightweight Styling resource keys can also be used in C# Markup through a collection of static helper classes available in the [Uno.Themes.WinUI.Markup](https://www.nuget.org/packages/Uno.Themes.WinUI.Markup/) NuGet package. The following code shows how to override several `FilledButton` resources in C# from the previous XAML example above. Notice that the `Button` is still using the `FilledButtonStyle` from Uno Material, but the resources are being overridden. ```csharp // basic filled button new Button() .Style(Theme.Button.Styles.Filled) .Content("Default Button Style"), // filled button with overridden colors new Button() .Style(Theme.Button.Styles.Filled) .Resources(config => config .Add(Theme.Button.Resources.BorderThickness, 2) .Add(Theme.Button.Resources.Filled.Foreground.Default, new SolidColorBrush(Colors.DarkGreen)) .Add(Theme.Button.Resources.Filled.Background.Default, new SolidColorBrush(Colors.LightGreen)) .Add(Theme.Button.Resources.Filled.BorderBrush.Default, new SolidColorBrush(Colors.DarkGreen)) ) .Content("Overridden Button Style"), // filled button with overridden colors for PointerOver state new Button() .Style(Theme.Button.Styles.Filled) .Resources(config => config .Add(Theme.Button.Resources.BorderThickness, 2) .Add(Theme.Button.Resources.Filled.Foreground.PointerOver, new SolidColorBrush(Colors.DarkRed)) .Add(Theme.Button.Resources.Filled.Background.PointerOver, new SolidColorBrush(Colors.LightPink)) .Add(Theme.Button.Resources.Filled.BorderBrush.PointerOver, new SolidColorBrush(Colors.DarkRed)) ) .Content("Overridden Button Style (PointerOver)") ``` ### Resource Key Pattern The general pattern used for mapping the Lightweight Styling resource keys to C# Markup is as follows: `Theme.{control}.Resources.{?:variant}.{member-path}.{?:visual-state}` | Name Part | Description | |----------------|--------------------------------------------------------------------------------------------------------------------------------------------------| | `control` | Name of the control type (Button, TextBox, CheckBox, etc.) | | `variant` | **(Optional) Defaults to `Default`** Certain styles have multiple variants. Ex: For Button we have variants such as: Outlined, Text, Filled | | `member-path` | The property or the nested property to assign value to. (Foreground, Background, Placeholder.Foreground, etc.) | | `visual-state` | **(Optional) Defaults to `Default`** Specifies which `VisualState` that this resource will be applied to (PointerOver, Checked, Disabled, etc.) | For example, the following resource keys are used with `FilledButtonStyle`, `HyperlinkButtonStyle`, and `CheckBoxStyle` from Uno Material: #### Filled Button - `Theme.Button.Resources.Filled.Foreground.Default` - `Theme.Button.Resources.Filled.Foreground.Pressed` - `Theme.Button.Resources.Filled.Foreground.PointerOver` #### HyperlinkButton (Default) - `Theme.HyperlinkButton.Resources.Default.Foreground.Default` - `Theme.HyperlinkButton.Resources.Default.Foreground.Pressed` - `Theme.HyperlinkButton.Resources.Default.Foreground.PointerOver` #### CheckBox (Default) - `Theme.CheckBox.Resources.Default.Foreground.Checked` - `Theme.CheckBox.Resources.Default.Foreground.CheckedPressed` - `Theme.CheckBox.Resources.Default.Foreground.CheckedPointerOver` All C# Markup-friendly Lightweight Styling resource keys can be found in [Uno.Themes GitHub repository](https://github.com/unoplatform/Uno.Themes/tree/master/src/library/Uno.Themes.WinUI.Markup/Theme) ## Resource Keys For more information about the lightweight styling resource keys used in each control, check out the following links: - [Button](styles/Button.md) - [CalendarDatePicker](styles/CalendarDatePicker.md) - [CheckBox](styles/CheckBox.md) - [ComboBox](styles/ComboBox.md) - [DatePicker](styles/DatePicker.md) - [FloatingActionButton](styles/FloatingActionButton.md) - [HyperlinkButton](styles/HyperlinkButton.md) - [NavigationView](styles/NavigationView.md) - [PasswordBox](styles/PasswordBox.md) - [PipsPager](styles/PipsPager.md) - [ProgressBar](styles/ProgressBar.md) - [ProgressRing](styles/ProgressRing.md) - [RadioButton](styles/RadioButton.md) - [RatingControl](styles/RatingControl.md) - [Slider](styles/Slider.md) - [TextBlock](styles/TextBlock.md) - [TextBox](styles/TextBox.md) - [ToggleButton](styles/ToggleButton.md) - [ToggleSwitch](styles/ToggleSwitch.md) ## Toolkit Toolkit also has controls that allow lightweight styling, check out [Lightweight Styling in Uno.Toolkit](#Toolkit.LightweightStyling). ### Further Reading [Lightweight Styling (Windows Dev Docs)](https://learn.microsoft.com/windows/apps/design/style/xaml-styles#lightweight-styling) ## Uno.Themes.Material.Colors # Material Colors and Brushes > [!IMPORTANT] > UnoFeatures: **Material** — add `Material` to your app's `.csproj` to include Uno Material resources. ## Colors | Key | LightValue | DarkValue | |------------------------------|------------|-----------| | `PrimaryColor` | `#5946D2` | `#C7BFFF` | | `PrimaryInverseColor` | `#C8BFFF` | `#2A009F` | | `OnPrimaryColor` | `#FFFFFF` | `#2A009F` | | `PrimaryContainerColor` | `#E5DEFF` | `#4129BA` | | `OnPrimaryContainerColor` | `#170065` | `#E4DFFF` | | `PrimaryVariantDarkColor` | `#0021C1` | `#4128BA` | | `PrimaryVariantLightColor` | `#9679FF` | `#C8BFFF` | | `SecondaryColor` | `#6B4EA2` | `#CDC2DC` | | `OnSecondaryColor` | `#FFFFFF` | `#332D41` | | `SecondaryContainerColor` | `#EBDDFF` | `#433C52` | | `OnSecondaryContainerColor` | `#220555` | `#EDDFFF` | | `SecondaryVariantDarkColor` | `#3B2574` | `#441F8A` | | `SecondaryVariantLightColor` | `#9B7BD5` | `#EBE6F1` | | `TertiaryColor` | `#0061A4` | `#9FCAFF` | | `OnTertiaryColor` | `#FFFFFF` | `#003258` | | `TertiaryContainerColor` | `#CFE4FF` | `#00497D` | | `OnTertiaryContainerColor` | `#001D36` | `#D1E4FF` | | `ErrorColor` | `#B3261E` | `#FFB4AB` | | `OnErrorColor` | `#FFFFFF` | `#690005` | | `ErrorContainerColor` | `#F9DEDC` | `#93000A` | | `OnErrorContainerColor` | `#410E0B` | `#FFDAD6` | | `BackgroundColor` | `#FCFBFF` | `#1C1B1F` | | `OnBackgroundColor` | `#1C1B1F` | `#E5E1E6` | | `SurfaceColor` | `#FFFFFF` | `#302D37` | | `OnSurfaceColor` | `#1C1B1F` | `#E6E1E5` | | `SurfaceVariantColor` | `#F2EFF5` | `#47464F` | | `OnSurfaceVariantColor` | `#8A8494` | `#C9C5D0` | | `SurfaceInverseColor` | `#313033` | `#E6E1E5` | | `OnSurfaceInverseColor` | `#F4EFF4` | `#1C1B1F` | | `SurfaceTintColor` | `#5946D2` | `#C7BFFF` | | `OutlineColor` | `#79747E` | `#928F99` | | `OutlineVariantColor` | `#C9C5D0` | `#57545D` | | `ShadowColor` | `#000000` | `#000000` | ## Opacities | Key | Value | |-----------------|-------| | HoverOpacity | 0.08 | | FocusedOpacity | 0.12 | | PressedOpacity | 0.12 | | DraggedOpacity | 0.16 | | SelectedOpacity | 0.08 | | MediumOpacity | 0.64 | | LowOpacity | 0.32 | | DisabledOpacity | 0.12 | ## Brushes | Key | Color | Opacity | |------------------------------------|------------------------------|-------------------| | PrimaryBrush | `PrimaryColor` | 1 | | PrimaryHoverBrush | `PrimaryColor` | `HoverOpacity` | | PrimaryFocusedBrush | `PrimaryColor` | `FocusedOpacity` | | PrimaryPressedBrush | `PrimaryColor` | `PressedOpacity` | | PrimaryDraggedBrush | `PrimaryColor` | `DraggedOpacity` | | PrimarySelectedBrush | `PrimaryColor` | `SelectedOpacity` | | PrimaryMediumBrush | `PrimaryColor` | `MediumOpacity` | | PrimaryLowBrush | `PrimaryColor` | `LowOpacity` | | PrimaryDisabledBrush | `PrimaryColor` | `DisabledOpacity` | | PrimaryInverseBrush | `PrimaryInverseColor` | 1 | | PrimaryInverseHoverBrush | `PrimaryInverseColor` | `HoverOpacity` | | PrimaryInverseFocusedBrush | `PrimaryInverseColor` | `FocusedOpacity` | | PrimaryInversePressedBrush | `PrimaryInverseColor` | `PressedOpacity` | | PrimaryInverseDraggedBrush | `PrimaryInverseColor` | `DraggedOpacity` | | PrimaryInverseSelectedBrush | `PrimaryInverseColor` | `SelectedOpacity` | | PrimaryInverseMediumBrush | `PrimaryInverseColor` | `MediumOpacity` | | PrimaryInverseLowBrush | `PrimaryInverseColor` | `LowOpacity` | | PrimaryInverseDisabledBrush | `PrimaryInverseColor` | `DisabledOpacity` | | OnPrimaryBrush | `OnPrimaryColor` | 1 | | OnPrimaryHoverBrush | `OnPrimaryColor` | `HoverOpacity` | | OnPrimaryFocusedBrush | `OnPrimaryColor` | `FocusedOpacity` | | OnPrimaryPressedBrush | `OnPrimaryColor` | `PressedOpacity` | | OnPrimaryDraggedBrush | `OnPrimaryColor` | `DraggedOpacity` | | OnPrimarySelectedBrush | `OnPrimaryColor` | `SelectedOpacity` | | OnPrimaryMediumBrush | `OnPrimaryColor` | `MediumOpacity` | | OnPrimaryLowBrush | `OnPrimaryColor` | `LowOpacity` | | OnPrimaryDisabledBrush | `OnPrimaryColor` | `DisabledOpacity` | | PrimaryContainerBrush | `PrimaryContainerColor` | 1 | | PrimaryContainerHoverBrush | `PrimaryContainerColor` | `HoverOpacity` | | PrimaryContainerFocusedBrush | `PrimaryContainerColor` | `FocusedOpacity` | | PrimaryContainerPressedBrush | `PrimaryContainerColor` | `PressedOpacity` | | PrimaryContainerDraggedBrush | `PrimaryContainerColor` | `DraggedOpacity` | | PrimaryContainerSelectedBrush | `PrimaryContainerColor` | `SelectedOpacity` | | PrimaryContainerMediumBrush | `PrimaryContainerColor` | `MediumOpacity` | | PrimaryContainerLowBrush | `PrimaryContainerColor` | `LowOpacity` | | PrimaryContainerDisabledBrush | `PrimaryContainerColor` | `DisabledOpacity` | | OnPrimaryContainerBrush | `OnPrimaryContainerColor` | 1 | | OnPrimaryContainerHoverBrush | `OnPrimaryContainerColor` | `HoverOpacity` | | OnPrimaryContainerFocusedBrush | `OnPrimaryContainerColor` | `FocusedOpacity` | | OnPrimaryContainerPressedBrush | `OnPrimaryContainerColor` | `PressedOpacity` | | OnPrimaryContainerDraggedBrush | `OnPrimaryContainerColor` | `DraggedOpacity` | | OnPrimaryContainerSelectedBrush | `OnPrimaryContainerColor` | `SelectedOpacity` | | OnPrimaryContainerMediumBrush | `OnPrimaryContainerColor` | `MediumOpacity` | | OnPrimaryContainerLowBrush | `OnPrimaryContainerColor` | `LowOpacity` | | OnPrimaryContainerDisabledBrush | `OnPrimaryContainerColor` | `DisabledOpacity` | | PrimaryVariantLightBrush | `PrimaryVariantLightColor` | 1 | | PrimaryVariantLightHoverBrush | `PrimaryVariantLightColor` | `HoverOpacity` | | PrimaryVariantLightFocusedBrush | `PrimaryVariantLightColor` | `FocusedOpacity` | | PrimaryVariantLightPressedBrush | `PrimaryVariantLightColor` | `PressedOpacity` | | PrimaryVariantLightDraggedBrush | `PrimaryVariantLightColor` | `DraggedOpacity` | | PrimaryVariantLightSelectedBrush | `PrimaryVariantLightColor` | `SelectedOpacity` | | PrimaryVariantLightMediumBrush | `PrimaryVariantLightColor` | `MediumOpacity` | | PrimaryVariantLightLowBrush | `PrimaryVariantLightColor` | `LowOpacity` | | PrimaryVariantLightDisabledBrush | `PrimaryVariantLightColor` | `DisabledOpacity` | | PrimaryVariantDarkBrush | `PrimaryVariantDarkColor` | 1 | | PrimaryVariantDarkHoverBrush | `PrimaryVariantDarkColor` | `HoverOpacity` | | PrimaryVariantDarkFocusedBrush | `PrimaryVariantDarkColor` | `FocusedOpacity` | | PrimaryVariantDarkPressedBrush | `PrimaryVariantDarkColor` | `PressedOpacity` | | PrimaryVariantDarkDraggedBrush | `PrimaryVariantDarkColor` | `DraggedOpacity` | | PrimaryVariantDarkSelectedBrush | `PrimaryVariantDarkColor` | `SelectedOpacity` | | PrimaryVariantDarkMediumBrush | `PrimaryVariantDarkColor` | `MediumOpacity` | | PrimaryVariantDarkLowBrush | `PrimaryVariantDarkColor` | `LowOpacity` | | PrimaryVariantDarkDisabledBrush | `PrimaryVariantDarkColor` | `DisabledOpacity` | | SecondaryBrush | `SecondaryColor` | 1 | | SecondaryHoverBrush | `SecondaryColor` | `HoverOpacity` | | SecondaryFocusedBrush | `SecondaryColor` | `FocusedOpacity` | | SecondaryPressedBrush | `SecondaryColor` | `PressedOpacity` | | SecondaryDraggedBrush | `SecondaryColor` | `DraggedOpacity` | | SecondarySelectedBrush | `SecondaryColor` | `SelectedOpacity` | | SecondaryMediumBrush | `SecondaryColor` | `MediumOpacity` | | SecondaryLowBrush | `SecondaryColor` | `LowOpacity` | | SecondaryDisabledBrush | `SecondaryColor` | `DisabledOpacity` | | OnSecondaryBrush | `OnSecondaryColor` | 1 | | OnSecondaryHoverBrush | `OnSecondaryColor` | `HoverOpacity` | | OnSecondaryFocusedBrush | `OnSecondaryColor` | `FocusedOpacity` | | OnSecondaryPressedBrush | `OnSecondaryColor` | `PressedOpacity` | | OnSecondaryDraggedBrush | `OnSecondaryColor` | `DraggedOpacity` | | OnSecondarySelectedBrush | `OnSecondaryColor` | `SelectedOpacity` | | OnSecondaryMediumBrush | `OnSecondaryColor` | `MediumOpacity` | | OnSecondaryLowBrush | `OnSecondaryColor` | `LowOpacity` | | OnSecondaryDisabledBrush | `OnSecondaryColor` | `DisabledOpacity` | | SecondaryContainerBrush | `SecondaryContainerColor` | 1 | | SecondaryContainerHoverBrush | `SecondaryContainerColor` | `HoverOpacity` | | SecondaryContainerFocusedBrush | `SecondaryContainerColor` | `FocusedOpacity` | | SecondaryContainerPressedBrush | `SecondaryContainerColor` | `PressedOpacity` | | SecondaryContainerDraggedBrush | `SecondaryContainerColor` | `DraggedOpacity` | | SecondaryContainerSelectedBrush | `SecondaryContainerColor` | `SelectedOpacity` | | SecondaryContainerMediumBrush | `SecondaryContainerColor` | `MediumOpacity` | | SecondaryContainerLowBrush | `SecondaryContainerColor` | `LowOpacity` | | SecondaryContainerDisabledBrush | `SecondaryContainerColor` | `DisabledOpacity` | | OnSecondaryContainerBrush | `OnSecondaryContainerColor` | 1 | | OnSecondaryContainerHoverBrush | `OnSecondaryContainerColor` | `HoverOpacity` | | OnSecondaryContainerFocusedBrush | `OnSecondaryContainerColor` | `FocusedOpacity` | | OnSecondaryContainerPressedBrush | `OnSecondaryContainerColor` | `PressedOpacity` | | OnSecondaryContainerDraggedBrush | `OnSecondaryContainerColor` | `DraggedOpacity` | | OnSecondaryContainerSelectedBrush | `OnSecondaryContainerColor` | `SelectedOpacity` | | OnSecondaryContainerMediumBrush | `OnSecondaryContainerColor` | `MediumOpacity` | | OnSecondaryContainerLowBrush | `OnSecondaryContainerColor` | `LowOpacity` | | OnSecondaryContainerDisabledBrush | `OnSecondaryContainerColor` | `DisabledOpacity` | | SecondaryVariantLightBrush | `SecondaryVariantLightColor` | 1 | | SecondaryVariantLightHoverBrush | `SecondaryVariantLightColor` | `HoverOpacity` | | SecondaryVariantLightFocusedBrush | `SecondaryVariantLightColor` | `FocusedOpacity` | | SecondaryVariantLightPressedBrush | `SecondaryVariantLightColor` | `PressedOpacity` | | SecondaryVariantLightDraggedBrush | `SecondaryVariantLightColor` | `DraggedOpacity` | | SecondaryVariantLightSelectedBrush | `SecondaryVariantLightColor` | `SelectedOpacity` | | SecondaryVariantLightMediumBrush | `SecondaryVariantLightColor` | `MediumOpacity` | | SecondaryVariantLightLowBrush | `SecondaryVariantLightColor` | `LowOpacity` | | SecondaryVariantLightDisabledBrush | `SecondaryVariantLightColor` | `DisabledOpacity` | | SecondaryVariantDarkBrush | `SecondaryVariantDarkColor` | 1 | | SecondaryVariantDarkHoverBrush | `SecondaryVariantDarkColor` | `HoverOpacity` | | SecondaryVariantDarkFocusedBrush | `SecondaryVariantDarkColor` | `FocusedOpacity` | | SecondaryVariantDarkPressedBrush | `SecondaryVariantDarkColor` | `PressedOpacity` | | SecondaryVariantDarkDraggedBrush | `SecondaryVariantDarkColor` | `DraggedOpacity` | | SecondaryVariantDarkSelectedBrush | `SecondaryVariantDarkColor` | `SelectedOpacity` | | SecondaryVariantDarkMediumBrush | `SecondaryVariantDarkColor` | `MediumOpacity` | | SecondaryVariantDarkLowBrush | `SecondaryVariantDarkColor` | `LowOpacity` | | SecondaryVariantDarkDisabledBrush | `SecondaryVariantDarkColor` | `DisabledOpacity` | | TertiaryBrush | `TertiaryColor` | 1 | | TertiaryHoverBrush | `TertiaryColor` | `HoverOpacity` | | TertiaryFocusedBrush | `TertiaryColor` | `FocusedOpacity` | | TertiaryPressedBrush | `TertiaryColor` | `PressedOpacity` | | TertiaryDraggedBrush | `TertiaryColor` | `DraggedOpacity` | | TertiarySelectedBrush | `TertiaryColor` | `SelectedOpacity` | | TertiaryMediumBrush | `TertiaryColor` | `MediumOpacity` | | TertiaryLowBrush | `TertiaryColor` | `LowOpacity` | | TertiaryDisabledBrush | `TertiaryColor` | `DisabledOpacity` | | OnTertiaryBrush | `OnTertiaryColor` | 1 | | OnTertiaryHoverBrush | `OnTertiaryColor` | `HoverOpacity` | | OnTertiaryFocusedBrush | `OnTertiaryColor` | `FocusedOpacity` | | OnTertiaryPressedBrush | `OnTertiaryColor` | `PressedOpacity` | | OnTertiaryDraggedBrush | `OnTertiaryColor` | `DraggedOpacity` | | OnTertiarySelectedBrush | `OnTertiaryColor` | `SelectedOpacity` | | OnTertiaryMediumBrush | `OnTertiaryColor` | `MediumOpacity` | | OnTertiaryLowBrush | `OnTertiaryColor` | `LowOpacity` | | OnTertiaryDisabledBrush | `OnTertiaryColor` | `DisabledOpacity` | | TertiaryContainerBrush | `TertiaryContainerColor` | 1 | | TertiaryContainerHoverBrush | `TertiaryContainerColor` | `HoverOpacity` | | TertiaryContainerFocusedBrush | `TertiaryContainerColor` | `FocusedOpacity` | | TertiaryContainerPressedBrush | `TertiaryContainerColor` | `PressedOpacity` | | TertiaryContainerDraggedBrush | `TertiaryContainerColor` | `DraggedOpacity` | | TertiaryContainerSelectedBrush | `TertiaryContainerColor` | `SelectedOpacity` | | TertiaryContainerMediumBrush | `TertiaryContainerColor` | `MediumOpacity` | | TertiaryContainerLowBrush | `TertiaryContainerColor` | `LowOpacity` | | TertiaryContainerDisabledBrush | `TertiaryContainerColor` | `DisabledOpacity` | | OnTertiaryContainerBrush | `OnTertiaryContainerColor` | 1 | | OnTertiaryContainerHoverBrush | `OnTertiaryContainerColor` | `HoverOpacity` | | OnTertiaryContainerFocusedBrush | `OnTertiaryContainerColor` | `FocusedOpacity` | | OnTertiaryContainerPressedBrush | `OnTertiaryContainerColor` | `PressedOpacity` | | OnTertiaryContainerDraggedBrush | `OnTertiaryContainerColor` | `DraggedOpacity` | | OnTertiaryContainerSelectedBrush | `OnTertiaryContainerColor` | `SelectedOpacity` | | OnTertiaryContainerMediumBrush | `OnTertiaryContainerColor` | `MediumOpacity` | | OnTertiaryContainerLowBrush | `OnTertiaryContainerColor` | `LowOpacity` | | OnTertiaryContainerDisabledBrush | `OnTertiaryContainerColor` | `DisabledOpacity` | | ErrorBrush | `ErrorColor` | 1 | | ErrorHoverBrush | `ErrorColor` | `HoverOpacity` | | ErrorFocusedBrush | `ErrorColor` | `FocusedOpacity` | | ErrorPressedBrush | `ErrorColor` | `PressedOpacity` | | ErrorDraggedBrush | `ErrorColor` | `DraggedOpacity` | | ErrorSelectedBrush | `ErrorColor` | `SelectedOpacity` | | ErrorMediumBrush | `ErrorColor` | `MediumOpacity` | | ErrorLowBrush | `ErrorColor` | `LowOpacity` | | ErrorDisabledBrush | `ErrorColor` | `DisabledOpacity` | | OnErrorBrush | `OnErrorColor` | 1 | | OnErrorHoverBrush | `OnErrorColor` | `HoverOpacity` | | OnErrorFocusedBrush | `OnErrorColor` | `FocusedOpacity` | | OnErrorPressedBrush | `OnErrorColor` | `PressedOpacity` | | OnErrorDraggedBrush | `OnErrorColor` | `DraggedOpacity` | | OnErrorSelectedBrush | `OnErrorColor` | `SelectedOpacity` | | OnErrorMediumBrush | `OnErrorColor` | `MediumOpacity` | | OnErrorLowBrush | `OnErrorColor` | `LowOpacity` | | OnErrorDisabledBrush | `OnErrorColor` | `DisabledOpacity` | | ErrorContainerBrush | `ErrorContainerColor` | 1 | | ErrorContainerHoverBrush | `ErrorContainerColor` | `HoverOpacity` | | ErrorContainerFocusedBrush | `ErrorContainerColor` | `FocusedOpacity` | | ErrorContainerPressedBrush | `ErrorContainerColor` | `PressedOpacity` | | ErrorContainerDraggedBrush | `ErrorContainerColor` | `DraggedOpacity` | | ErrorContainerSelectedBrush | `ErrorContainerColor` | `SelectedOpacity` | | ErrorContainerMediumBrush | `ErrorContainerColor` | `MediumOpacity` | | ErrorContainerLowBrush | `ErrorContainerColor` | `LowOpacity` | | ErrorContainerDisabledBrush | `ErrorContainerColor` | `DisabledOpacity` | | OnErrorContainerBrush | `OnErrorContainerColor` | 1 | | OnErrorContainerHoverBrush | `OnErrorContainerColor` | `HoverOpacity` | | OnErrorContainerFocusedBrush | `OnErrorContainerColor` | `FocusedOpacity` | | OnErrorContainerPressedBrush | `OnErrorContainerColor` | `PressedOpacity` | | OnErrorContainerDraggedBrush | `OnErrorContainerColor` | `DraggedOpacity` | | OnErrorContainerSelectedBrush | `OnErrorContainerColor` | `SelectedOpacity` | | OnErrorContainerMediumBrush | `OnErrorContainerColor` | `MediumOpacity` | | OnErrorContainerLowBrush | `OnErrorContainerColor` | `LowOpacity` | | OnErrorContainerDisabledBrush | `OnErrorContainerColor` | `DisabledOpacity` | | BackgroundBrush | `BackgroundColor` | 1 | | BackgroundHoverBrush | `BackgroundColor` | `HoverOpacity` | | BackgroundFocusedBrush | `BackgroundColor` | `FocusedOpacity` | | BackgroundPressedBrush | `BackgroundColor` | `PressedOpacity` | | BackgroundDraggedBrush | `BackgroundColor` | `DraggedOpacity` | | BackgroundSelectedBrush | `BackgroundColor` | `SelectedOpacity` | | BackgroundMediumBrush | `BackgroundColor` | `MediumOpacity` | | BackgroundLowBrush | `BackgroundColor` | `LowOpacity` | | BackgroundDisabledBrush | `BackgroundColor` | `DisabledOpacity` | | OnBackgroundBrush | `OnBackgroundColor` | 1 | | OnBackgroundHoverBrush | `OnBackgroundColor` | `HoverOpacity` | | OnBackgroundFocusedBrush | `OnBackgroundColor` | `FocusedOpacity` | | OnBackgroundPressedBrush | `OnBackgroundColor` | `PressedOpacity` | | OnBackgroundDraggedBrush | `OnBackgroundColor` | `DraggedOpacity` | | OnBackgroundSelectedBrush | `OnBackgroundColor` | `SelectedOpacity` | | OnBackgroundMediumBrush | `OnBackgroundColor` | `MediumOpacity` | | OnBackgroundLowBrush | `OnBackgroundColor` | `LowOpacity` | | OnBackgroundDisabledBrush | `OnBackgroundColor` | `DisabledOpacity` | | SurfaceBrush | `SurfaceColor` | 1 | | SurfaceHoverBrush | `SurfaceColor` | `HoverOpacity` | | SurfaceFocusedBrush | `SurfaceColor` | `FocusedOpacity` | | SurfacePressedBrush | `SurfaceColor` | `PressedOpacity` | | SurfaceDraggedBrush | `SurfaceColor` | `DraggedOpacity` | | SurfaceSelectedBrush | `SurfaceColor` | `SelectedOpacity` | | SurfaceMediumBrush | `SurfaceColor` | `MediumOpacity` | | SurfaceLowBrush | `SurfaceColor` | `LowOpacity` | | SurfaceDisabledBrush | `SurfaceColor` | `DisabledOpacity` | | OnSurfaceBrush | `OnSurfaceColor` | 1 | | OnSurfaceHoverBrush | `OnSurfaceColor` | `HoverOpacity` | | OnSurfaceFocusedBrush | `OnSurfaceColor` | `FocusedOpacity` | | OnSurfacePressedBrush | `OnSurfaceColor` | `PressedOpacity` | | OnSurfaceDraggedBrush | `OnSurfaceColor` | `DraggedOpacity` | | OnSurfaceSelectedBrush | `OnSurfaceColor` | `SelectedOpacity` | | OnSurfaceMediumBrush | `OnSurfaceColor` | `MediumOpacity` | | OnSurfaceLowBrush | `OnSurfaceColor` | `DisabledOpacity` | | OnSurfaceDisabledBrush | `OnSurfaceColor` | `DisabledOpacity` | | SurfaceVariantBrush | `SurfaceVariantColor` | 1 | | SurfaceVariantHoverBrush | `SurfaceVariantColor` | `HoverOpacity` | | SurfaceVariantFocusedBrush | `SurfaceVariantColor` | `FocusedOpacity` | | SurfaceVariantPressedBrush | `SurfaceVariantColor` | `PressedOpacity` | | SurfaceVariantDraggedBrush | `SurfaceVariantColor` | `DraggedOpacity` | | SurfaceVariantSelectedBrush | `SurfaceVariantColor` | `SelectedOpacity` | | SurfaceVariantMediumBrush | `SurfaceVariantColor` | `MediumOpacity` | | SurfaceVariantLowBrush | `SurfaceVariantColor` | `LowOpacity` | | SurfaceVariantDisabledBrush | `SurfaceVariantColor` | `DisabledOpacity` | | OnSurfaceVariantBrush | `OnSurfaceVariantColor` | 1 | | OnSurfaceVariantHoverBrush | `OnSurfaceVariantColor` | `HoverOpacity` | | OnSurfaceVariantFocusedBrush | `OnSurfaceVariantColor` | `FocusedOpacity` | | OnSurfaceVariantPressedBrush | `OnSurfaceVariantColor` | `PressedOpacity` | | OnSurfaceVariantDraggedBrush | `OnSurfaceVariantColor` | `DraggedOpacity` | | OnSurfaceVariantSelectedBrush | `OnSurfaceVariantColor` | `SelectedOpacity` | | OnSurfaceVariantMediumBrush | `OnSurfaceVariantColor` | `MediumOpacity` | | OnSurfaceVariantLowBrush | `OnSurfaceVariantColor` | `LowOpacity` | | OnSurfaceVariantDisabledBrush | `OnSurfaceVariantColor` | `DisabledOpacity` | | SurfaceInverseBrush | `SurfaceInverseColor` | 1 | | SurfaceInverseHoverBrush | `SurfaceInverseColor` | `HoverOpacity` | | SurfaceInverseFocusedBrush | `SurfaceInverseColor` | `FocusedOpacity` | | SurfaceInversePressedBrush | `SurfaceInverseColor` | `PressedOpacity` | | SurfaceInverseDraggedBrush | `SurfaceInverseColor` | `DraggedOpacity` | | SurfaceInverseSelectedBrush | `SurfaceInverseColor` | `SelectedOpacity` | | SurfaceInverseMediumBrush | `SurfaceInverseColor` | `MediumOpacity` | | SurfaceInverseLowBrush | `SurfaceInverseColor` | `LowOpacity` | | SurfaceInverseDisabledBrush | `SurfaceInverseColor` | `DisabledOpacity` | | OnSurfaceInverseBrush | `OnSurfaceInverseColor` | 1 | | OnSurfaceInverseHoverBrush | `OnSurfaceInverseColor` | `HoverOpacity` | | OnSurfaceInverseFocusedBrush | `OnSurfaceInverseColor` | `FocusedOpacity` | | OnSurfaceInversePressedBrush | `OnSurfaceInverseColor` | `PressedOpacity` | | OnSurfaceInverseDraggedBrush | `OnSurfaceInverseColor` | `DraggedOpacity` | | OnSurfaceInverseSelectedBrush | `OnSurfaceInverseColor` | `SelectedOpacity` | | OnSurfaceInverseMediumBrush | `OnSurfaceInverseColor` | `MediumOpacity` | | OnSurfaceInverseLowBrush | `OnSurfaceInverseColor` | `LowOpacity` | | OnSurfaceInverseDisabledBrush | `OnSurfaceInverseColor` | `DisabledOpacity` | | OutlineBrush | `OutlineColor` | 1 | | OutlineHoverBrush | `OutlineColor` | `HoverOpacity` | | OutlineFocusedBrush | `OutlineColor` | `FocusedOpacity` | | OutlinePressedBrush | `OutlineColor` | `PressedOpacity` | | OutlineDraggedBrush | `OutlineColor` | `DraggedOpacity` | | OutlineSelectedBrush | `OutlineColor` | `SelectedOpacity` | | OutlineMediumBrush | `OutlineColor` | `MediumOpacity` | | OutlineLowBrush | `OutlineColor` | `LowOpacity` | | OutlineDisabledBrush | `OutlineColor` | `DisabledOpacity` | | OutlineVariantBrush | `OutlineVariantColor` | 1 | | OutlineVariantHoverBrush | `OutlineVariantColor` | `HoverOpacity` | | OutlineVariantFocusedBrush | `OutlineVariantColor` | `FocusedOpacity` | | OutlineVariantPressedBrush | `OutlineVariantColor` | `PressedOpacity` | | OutlineVariantDraggedBrush | `OutlineVariantColor` | `DraggedOpacity` | | OutlineVariantSelectedBrush | `OutlineVariantColor` | `SelectedOpacity` | | OutlineVariantMediumBrush | `OutlineVariantColor` | `MediumOpacity` | | OutlineVariantLowBrush | `OutlineVariantColor` | `LowOpacity` | | OutlineVariantDisabledBrush | `OutlineVariantColor` | `DisabledOpacity` | | SurfaceTintBrush | `SurfaceTintColor` | 1 | ## Uno.Themes.Material.Styles # Material Controls Styles > [!IMPORTANT] > UnoFeatures: **Material** add `Material` to your app's `.csproj` to include Uno Material resources. | Control | Style Key | IsDefaultStyle\* | |---------------------------|---------------------------------|------------------| | `AppBarButton` | `AppBarButtonStyle` | True | | `Button` | `ElevatedButtonStyle` | | | `Button` | `FilledButtonStyle` | True | | `Button` | `FilledTonalButtonStyle` | | | `Button` | `OutlinedButtonStyle` | | | `Button` | `TextButtonStyle` | | | `Button` | `IconButtonStyle` | | | `Button` | `FabStyle` | | | `Button` | `SurfaceFabStyle` | | | `Button` | `SecondaryFabStyle` | | | `Button` | `TertiaryFabStyle` | | | `Button` | `SmallFabStyle` | | | `Button` | `SurfaceSmallFabStyle` | | | `Button` | `SecondarySmallFabStyle` | | | `Button` | `TertiarySmallFabStyle` | | | `Button` | `LargeFabStyle` | | | `Button` | `SurfaceLargeFabStyle` | | | `Button` | `SecondaryLargeFabStyle` | | | `Button` | `TertiaryLargeFabStyle` | | | `CalendarDatePicker` | `CalendarDatePickerStyle` | True | | `CalendarView` | `CalendarViewStyle` | True | | `CheckBox` | `CheckBoxStyle` | True | | `ComboBox` | `ComboBoxStyle` | True | | `CommandBar` | `CommandBarStyle` | True | | `ContentDialog` | `ContentDialogStyle` | True | | `DatePicker` | `DatePickerStyle` | True | | `FlyoutPresenter` | `FlyoutPresenterStyle` | True | | `HyperlinkButton` | `HyperlinkButtonStyle` | True | | `HyperlinkButton` | `SecondaryHyperlinkButtonStyle` | | | `ListView` | `ListViewStyle` | True | | `ListViewItem` | `ListViewItemStyle` | True | | `MenuFlyoutItem` | `MenuFlyoutItemStyle` | True | | `MenuFlyoutPresenter` | `MenuFlyoutPresenterStyle` | True | | `muxc:NavigationView` | `NavigationViewStyle` | True | | `muxc:NavigationViewItem` | `NavigationViewItemStyle` | True | | `muxc:ProgressBar` | `ProgressBarStyle` | True | | `muxc:ProgressRing` | `ProgressRingStyle` | True | | `PasswordBox` | `FilledPasswordBoxStyle` | | | `PasswordBox` | `OutlinedPasswordBoxStyle` | True | | `muxc:PipsPager` | `PipsPagerStyle` | True | | `RadioButton` | `RadioButtonStyle` | True | | `RatingControl` | `RatingControlStyle` | True | | `RatingControl` | `SecondaryRatingControlStyle` | | | `Slider` | `SliderStyle` | True | | `TextBlock` | `DisplayLarge` | | | `TextBlock` | `DisplayMedium` | | | `TextBlock` | `DisplaySmall` | | | `TextBlock` | `HeadlineLarge` | | | `TextBlock` | `HeadlineMedium` | | | `TextBlock` | `HeadlineSmall` | | | `TextBlock` | `TitleLarge` | | | `TextBlock` | `TitleMedium` | | | `TextBlock` | `TitleSmall` | | | `TextBlock` | `LabelLarge` | | | `TextBlock` | `LabelMedium` | | | `TextBlock` | `LabelSmall` | | | `TextBlock` | `LabelExtraSmall` | | | `TextBlock` | `BodyLarge` | | | `TextBlock` | `BodyMedium` | True | | `TextBlock` | `BodySmall` | | | `TextBlock` | `CaptionLarge` | | | `TextBlock` | `CaptionMedium` | | | `TextBlock` | `CaptionSmall` | | | `TextBox` | `FilledTextBoxStyle` | | | `TextBox` | `OutlinedTextBoxStyle` | True | | `ToggleButton` | `TextToggleButtonStyle` | | | `ToggleButton` | `IconToggleButtonStyle` | True | | `ToggleSwitch` | `ToggleSwitchStyle` | True | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Uno.Themes.Material.DSP # Using the DSP Tooling in Uno.Material > [!IMPORTANT] > UnoFeatures: **Material** and **Dsp** — add `Material; Dsp;` to your app's `.csproj` to include Uno Material and Dsp resources. ## Introduction Is it possible to automate the creation of the Material Design color palette? Yes, it is. Uno.Material provides a tooling to generate the color palette from the official Material Design color palette. This tooling is available in the [Uno.Dsp.Cli](https://nuget.org/packages/Uno.Dsp.Cli) and [Uno.Dsp.Tasks](https://nuget.org/packages/Uno.Dsp.Tasks) NuGet packages. The following instructions will cover the Uno.Dsp.Tasks version, which is more automatic. > [!NOTE] > Make sure you are referencing the generated XAML file in your > application's `App.xaml` file, as shown in the following example: > > ```xml > ColorOverrideSource="ms-appx:///PROJECT_NAME/Styles/Application/MaterialColorsOverride.xaml" /> > ``` > > More details [In the _Manual Color Overrides_ section of the Getting Started page](#Uno.Themes.Material.GetStarted) ## The Uno.Dsp.Tasks NuGet package This package will be automatically present in the project after [creating a new Uno Platform project](https://aka.platform.uno/get-started) specifying the _Material_ theme. It is also possible to add it manually to an existing Uno Platform project by adding the following line to the _PackageReference_ section of the _csproj_ file: * Add a nuget package reference: ```xml ``` * The package is already present when you select _Material_ theme during project creation: ![Selection of Material theme when creating a project using the Uno Template Wizard](assets/material-theme-selection-wizard.png) It is possible to configure the import process. The _UnoDspImportColors_ item found in the _csproj_ file has a number of attributes we can set: | Attribute | Description | Default Value | |------------------|---------------------------------|-------------------------| | `Include` | Style files to input | | | `Generator`* | Type of generator to use | `Xaml` | | `OutputPath`** | Path to use for the output | Input file directory | \* The possible values for `Generator` are `Xaml` or `Csharp`. \*\* If `Include` is a glob (eg: \*.json), `OutputPath` should be a directory. ```xml ``` ## Generating a custom color palette and exporting it as a JSON file 1. Navigate to the [Material Theme Builder](https://aka.platform.uno/uno-material-themebuilder) and select the colors you want to use for your application. 2. When you are done customizing, open the **Export** section located at the top rightmost of the screen. ![material-theme-export-section](assets/material-theme-export-section.png) 3. In the **Export** section, locate the _Export_ button and pick the _Material Theme (JSON)_ format. ![material-theme-export-button](assets/material-theme-export-button.png) ![material-theme-export-json](assets/material-theme-export-json.png) 4. Save the file to your computer. 5. Replace the `ColorPaletteOverride.json` file in the `Styles` folder of your application project with the one you just downloaded. 6. Build your application. The `ColorPaletteOverride.xaml` file will be automatically updated with the colors present in the JSON file. ## More flexibility Using `Uno.Dsp.Tasks` will generate the file at each build, potentially overriding any changes you made to it. If you want to keep it that way, you can remove the `ColorPaletteOverride.json` file from the `Styles` folder so it won't get overwritten. Alternatively, you can use the [Uno.Dsp.Cli](https://nuget.org/packages/Uno.Dsp.Cli) package to generate the file from the command line. This tool allows you to generate the file only when desired rather than during every build. > [!NOTE] > Although the **Material Theme Builder Tool** doesn't export **Material Tokens (DSP)** packages anymore, to import DSP packages just follow the same steps described previously and save the downloaded DSP zip file as `ColorPaletteOverride.zip` in the `Styles` folder of your application project. > In that case, make sure to delete the `material-theme.json` file from `Styles` folder before building your application, to avoid conflicts. ## Uno.Themes.Material.GetStarted # Uno Material

Material design system

> [!IMPORTANT] > UnoFeatures: **Material** add `Material` to your app's `.csproj` to add Uno Material. The Uno Material library is enabled through the `Material` UnoFeatures, which brings in the required packages for new and existing Uno Platform solutions. Uno Material lets you apply [Material Design 3](https://m3.material.io/) styling to your application with just a few lines of code. > [!WARNING] > If you are updating Uno Material to v2 from an older 1.x version of the package, additional steps will be required. Refer to the [Uno Material Migration Guide](material-migration.md). ## Getting Started Initialization of the Uno Material resources is handled by the specialized `MaterialTheme` ResourceDictionary. ### `MaterialTheme` #### Constructors | Constructor | Description | |--------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------| | `MaterialTheme()` | Initializes a new instance of the `MaterialTheme` resource dictionary. | | `MaterialTheme(ResourceDictionary? colorOverride, ResourceDictionary? fontOverride)` | Initializes a new instance of the `MaterialTheme` resource dictionary and applies the given overrides | #### Properties | Property | Type | Description | |-----------------------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `ColorOverrideSource` | `string` | (Optional) Gets or sets a Uniform Resource Identifier that provides the source location of a `ResourceDictionary` containing overrides for the default Uno Material Color resources | | `FontOverrideSource` | `string` | (Optional) Gets or sets a Uniform Resource Identifier that provides the source location of a `ResourceDictionary` containing overrides for the default Uno Material font resources | ### Creating a new project with Uno Material > [!NOTE] > Make sure to setup your environment first by [following our instructions](#Uno.GetStarted.vs2022). #### [**Wizard**](#tab/wizard) 1. Follow the steps in the [Getting Started with Visual Studio](#Uno.GettingStarted.CreateAnApp.VS2022) instructions to launch the Uno Platform Template Wizard. 2. Select `Material` under the `Theme` section. ![Material selection in Wizard](assets/material-wizard.png) #### [**CLI**](#tab/cli) 1. Install the [`dotnet new` CLI templates](#Uno.GetStarted.dotnet-new) with: ```bash dotnet new install Uno.Templates ``` 2. Create a new application with: ```bash dotnet new unoapp -o UnoMaterialApp -theme material ``` ## Customization The following guides require the creation of new `ResourceDictionary` files in your application project. For more information on how to define styles and resources in a separate `ResourceDictionary`, refer to the [resource management documentation](#Guide.HowTo.Create-Control-Library). ### Color Overrides using _Material Theme Builder_ and DSP format It is possible to use the [Material Theme Builder](https://aka.platform.uno/uno-material-themebuilder) to generate a custom color palette derived from your own basic colors. The generated palette is provided in the [DSP format](https://m3.material.io/styles/color/the-color-system/color-dsp) and can be used to override the default Uno Material colors. The tooling required to generate the _Material Colors Override_ file from a theme file (JSON file) will be present by default when creating an Uno Platform application with support for Uno Material from the Wizard. ![Wizard - Theme Selection](assets/material-theme-selection-wizard.png) Follow this link to get [more Information about the DSP tooling](#Uno.Themes.Material.DSP). ### Manual Color Overrides Use this when you want to manually override the default color palette from the Uno Material library. 1. Add a new Resource Dictionary named `MaterialColorsOverride.xaml` to the application project, for example, under `Styles/Application`. 2. Replace the content with: ```xml #6750A4 #D0BCFF #FFFFFF #EADDFF #21005E #353FE5 #B6A8FB #625B71 #FFFFFF #E5DFF9 #1B192C #2BB27E #9CFFDF #7D5260 #FFFFFF #FFD8E4 #370B1E #B3261E #FFFFFF #F9DEDC #370B1E #FFFBFE #1C1B1F #FFFBFE #1C1B1F #E7E0EC #A5A0AC #313033 #F4EFF4 #5946D2 #79747E #C9C5D0 #D0BCFF #371E73 #4F378B #EADDFF #6750A4 #353FE5 #D4CBFC #CCC2DC #332D41 #474459 #E5DFF9 #2BB27E #9CFFDF #EFB8C8 #492532 #633B48 #FFD8E4 #F2B8B5 #601410 #8C1D18 #F9DEDC #1C1B1F #E6E1E5 #1C1B1F #E6E1E5 #49454F #CAC4D0 #E6E1E5 #313033 #C7BFFF #938F99 #57545D ``` 3. In `App.xaml`, update `` with the override from the previous steps: ```xml ``` ### Change Default Font By default, Uno Material comes pre-packaged with the [Roboto](https://fonts.google.com/specimen/Roboto) font families and automatically includes them in your application. Upon installation of the Uno Material package, you will have the following resources available: `MaterialLightFontFamily`, `MaterialRegularFontFamily`, and `MaterialMediumFontFamily`. If you would like Uno Material to use a different font, you can override the default font families by following these steps: 1. Add the custom font following [Custom Fonts documentation](https://platform.uno/docs/articles/features/custom-fonts.html). 2. Add a new Resource Dictionary named `MaterialFontsOverride.xaml` to the application project, for example, under `Styles/Application`. 3. Assuming the font file has been placed in a directory such as `Assets/Fonts/MyCustomFont.ttf`, your override file would look like the following: ```xml ms-appx:///Assets/Fonts/MyCustomFont.ttf#MyCustomFont ms-appx:///Assets/Fonts/MyCustomFont.ttf#MyCustomFont ms-appx:///Assets/Fonts/MyCustomFont.ttfMyCustomFont ``` 4. In the `App.xaml`, update `` with the override from the previous steps: ```xml ``` ## Using C# Markup Uno Material also has support for C# Markup through a [Uno.Material.WinUI.Markup](https://www.nuget.org/packages/Uno.Material.WinUI.Markup) NuGet Package. To get started with Uno Material in your C# Markup application, add the `Uno.Material.WinUI.Markup` NuGet package to your application project. Then, add the following code to your `App.xaml.cs`: ```csharp using Uno.Material.Markup; this.Build(r => r.UseMaterial( //optional new Styles.ColorPaletteOverride(), //optional new Styles.MaterialFontsOverride())); ``` ## Additional Resources - [Uno Platform Material Sample App](https://aka.platform.uno/unomaterial-sampleapp) - [Uno Platform Material Figma File](https://aka.platform.uno/uno-figma-material-toolkit) - [Official Material Design 3 Guidelines](https://m3.material.io/components) - [Official Material Design 3 Theme Builder](https://m3.material.io/theme-builder) ## Uno.Themes.Material.Migration # Upgrading Uno Material > [!IMPORTANT] > UnoFeatures: **Material** add `Material` to your app's `.csproj` to include Uno Material resources. ## Upgrading to Uno Themes v5 The Uno Material v5 packages introduce a new dependency on the [Uno Themes](https://www.nuget.org/packages/Uno.Themes.WinUI) package. Uno Themes is the base library for all design system implementations going forward. As a result, the following changes have been made: ### Upgrading to Uno Themes 5.8 #### `Button` focus states resources removal This update simplifies focus handling in Button style templates by removing redundant "Focused" and "PointerFocused" resource values: | Removed Resource Key | | --------------------------------------------------- | | ElevatedButtonForegroundFocused | | ElevatedButtonForegroundPointerFocused | | ElevatedButtonIconForegroundFocused | | ElevatedButtonIconForegroundPointerFocused | | ElevatedButtonBackgroundFocused | | ElevatedButtonBackgroundPointerFocused | | ElevatedButtonBorderBrushFocused | | ElevatedButtonBorderBrushPointerFocused | | ElevatedButtonStateLayerBackgroundFocused | | ElevatedButtonStateLayerBackgroundPointerFocused | | FilledButtonForegroundPointerFocused | | FilledButtonForegroundFocused | | FilledButtonIconForegroundFocused | | FilledButtonIconForegroundPointerFocused | | FilledButtonBackgroundFocused | | FilledButtonBackgroundPointerFocused | | FilledButtonBorderBrushFocused | | FilledButtonBorderBrushPointerFocused | | FilledButtonStateLayerBackgroundFocused | | FilledButtonStateLayerBackgroundPointerFocused | | FilledTonalButtonForegroundFocused | | FilledTonalButtonForegroundPointerFocused | | FilledTonalButtonIconForegroundFocused | | FilledTonalButtonIconForegroundPointerFocused | | FilledTonalButtonBackgroundFocused | | FilledTonalButtonBackgroundPointerFocused | | FilledTonalButtonBorderBrushFocused | | FilledTonalButtonBorderBrushPointerFocused | | FilledTonalButtonStateLayerBackgroundFocused | | FilledTonalButtonStateLayerBackgroundPointerFocused | | OutlinedButtonForegroundFocused | | OutlinedButtonForegroundPointerFocused | | OutlinedButtonIconForegroundFocused | | OutlinedButtonIconForegroundPointerFocused | | OutlinedButtonBackgroundFocused | | OutlinedButtonBackgroundPointerFocused | | OutlinedButtonBorderBrushFocused | | OutlinedButtonBorderBrushPointerFocused | | OutlinedButtonStateLayerBackgroundFocused | | OutlinedButtonStateLayerBackgroundPointerFocused | | TextButtonForegroundFocused | | TextButtonForegroundPointerFocused | | TextButtonIconForegroundFocused | | TextButtonIconForegroundPointerFocused | | TextButtonBackgroundFocused | | TextButtonBackgroundPointerFocused | | TextButtonBorderBrushFocused | | TextButtonBorderBrushPointerFocused | | TextButtonStateLayerBackgroundFocused | | TextButtonStateLayerBackgroundPointerFocused | ### Upgrading to Uno Themes 5.4 We have standardized the naming of styles and resource keys. This change aims to simplify resource key usage and align the naming convention across Uno Themes. #### Changes to Resource Keys | Old Resource Key | New Resource Key | | ------------------------------------------------- | ----------------------------------------- | | MaterialTextBoxClearGlyphWidth | TextBoxClearGlyphWidth | | MaterialTextBoxClearGlyphHeight | TextBoxClearGlyphHeight | | MaterialFilledTextBoxCornerRadius | FilledTextBoxCornerRadius | | MaterialFilledTextBoxPadding | FilledTextBoxPadding | | MaterialFilledTextBoxMinHeight | FilledTextBoxMinHeight | | MaterialFilledTextBoxBorderHeightFocused | FilledTextBoxBorderHeightFocused | | MaterialOutlinedTextBoxBorderThickness | OutlinedTextBoxBorderThickness | | MaterialOutlinedTextBoxCornerRadius | OutlinedTextBoxCornerRadius | | MaterialOutlinedTextBoxPadding | OutlinedTextBoxPadding | | MaterialOutlinedTextBoxMinHeight | OutlinedTextBoxMinHeight | | MaterialOutlinedTextBoxBorderThicknessFocused | OutlinedTextBoxBorderThicknessFocused | | MaterialOutlinedTextBoxBorderThicknessPointerOver | OutlinedTextBoxBorderThicknessPointerOver | | OutlinedPasswordBoxBorderPadding | **_REMOVED_** | | OutlinedPasswordBoxBorderPaddingPointerOver | **_REMOVED_** | | OutlinedPasswordBoxBorderPaddingFocused | **_REMOVED_** | ### Upgrading to Uno Themes 5.1 #### TextBox `PlaceholderText` and `Header` Previously, the `PlaceholderText` property acted as a header, displaying in the normal state and animating upwards when the text is set or being entered. And, the `Header` property did nothing. Now, both `PlaceholderText` and `Header` are supported and their behaviors have changed. ##### New Behavior - **PlaceholderText**: Displays inside the TextBox when it's empty. Disappears when text is entered. - **Header**: Acts as a label. Animates upwards when text is entered. ##### Example **Old Usage:** ```xml ``` **New Usage:** ```xml ``` Update your TextBox elements to use `Header` for labels and `PlaceholderText` for placeholders. ### Converters All Converters were moved to the base `Uno.Themes` library, and the new `namespace` is `Uno.Themes`. Before: ```xml ``` After: ```xml ``` Some `Converters` have been renamed, you can find the `Old Name` and `New Name` in the table below: | Old Name | New Name | | ---------------------------------------------------------------------- | ------------------------------- | | MaterialTrueToVisible | TrueToVisibleConverter | | MaterialTrueToCollapsed | TrueToCollapsedConverter | | CheckBoxIsCheckedToFocusStateCircleVisible | FalseToCollapsedConverter | | CheckBoxIsCheckedToFocusStateCircleCollapsed | FalseToVisibleConverter | | MaterialEmptyToFalse/
CupertinoEmptyToFalse | EmptyToFalseConverter | | MaterialEmptyToTrue/
CupertinoEmptyToTrue | EmptyToTrueConverter | | MaterialEmptyToVisible | EmptyToVisibleConverter | | MaterialEmptyToCollapsed | EmptyToCollapsedConverter | | MaterialNullToCollapsedConverter/
CupertinoNullToCollapsedConverter | NullToCollapsedConverter | | MaterialNullToVisibleConverter | NullToVisibleConverter | | MaterialNullToTransparent | NullToTransparentConverter | | MaterialEmptyOrNullToVisible | EmptyOrNullToVisibleConverter | | MaterialEmptyOrNullToCollapsed | EmptyOrNullToCollapsedConverter | | StringFormatConverter | StringFormatConverter | | FirstCharacterConverter | FirstCharacterConverter | | ToUpperConverter | ToUpperConverter | ### Control Extensions All Controls Extensions were moved to the `Uno.Themes` library, and the new namespace is `Uno.Themes`. Before: ```xml ``` After: ```xml ``` ### Opacity and brushes The opacity values of certain brushes has been adjusted to better align with the Figma design file: | Opacity variant | Old Value | New Value | | --------------- | --------- | --------- | | Medium | 0.54 | 0.64 | | Disabled | 0.38 | 0.12 | | DisabledLow | 0.12 | _removed_ | Existing explicit references to `-DisabledLow` resources should now be updated to use `-Disabled`. ### Resources Certain Lightweight Styling resource keys have been edited to align with those coming from `Microsoft.UI.Xaml`. #### RatingControl | Old Key | New Key | | ------------------------------------------------------- | ------------------------------------------------------- | | `RatingControlForegroundUnselected` | `RatingControlUnselectedForeground` | | `RatingControlForegroundSelected` | `RatingControlSelectedForeground` | | `RatingControlForegroundPointerOverUnselected` | `RatingControlUnselectedForegroundPointerOver` | | `RatingControlForegroundPointerOverSelected` | `RatingControlSelectedForegroundPointerOver` | | `RatingControlForegroundDisabledSelected` | `RatingControlSelectedForegroundDisabled` | | `SecondaryRatingControlForegroundUnselected` | `SecondaryRatingControlUnselectedForeground` | | `SecondaryRatingControlForegroundSelected` | `SecondaryRatingControlSelectedForeground` | | `SecondaryRatingControlForegroundPointerOverUnselected` | `SecondaryRatingControlUnselectedForegroundPointerOver` | | `SecondaryRatingControlForegroundPointerOverSelected` | `SecondaryRatingControlSelectedForegroundPointerOver` | | `SecondaryRatingControlForegroundDisabledSelected` | `SecondaryRatingControlSelectedForegroundDisabled` | ## Upgrading to Uno.Material v3 Uno.Material v3 (not to be confused with [Material Design 3](https://m3.material.io/) from Google) introduces support for [Lightweight Styling](lightweight-styling.md) as well as some breaking changes to the default style keys for some controls. Refer to the tables below for the changes that have been made within Uno.Material. ### Styles #### Removed | Key | TargetType | | ----------------------------------- | -------------- | | `DefaultMaterialCalendarViewStyle` | `CalendarView` | | `MaterialSecondaryCheckBoxStyle` | `CheckBox` | | `MaterialSecondaryRadioButtonStyle` | `RadioButton` | #### Added | Key | Aliased Key | TargetType | Implicit Style | | ---------------------------- | -------------------- | -------------------- | -------------- | | `MaterialRatingControlStyle` | `RatingControlStyle` | `muxc:RatingControl` | true | | `MaterialRippleStyle` | `RippleStyle` | `um:Ripple` | true | #### Modified | Key | Aliased Key | TargetType | Implicit Style | | ----------------------------------- | --------------------------- | ---------------------- | -------------- | | `MaterialToggleMenuFlyoutItemStyle` | `ToggleMenuFlyoutItemStyle` | `ToggleMenuFlyoutItem` | false -> true | | `MaterialMenuFlyoutSubItemStyle` | `MenuFlyoutSubItemStyle` | `MenuFlyoutSubItem` | false -> true | | `MaterialMenuFlyoutSeparatorStyle` | `MenuFlyoutSeparatorStyle` | `MenuFlyoutSeparator` | false -> true | | `MaterialFilledPasswordBoxStyle` | `FilledPasswordBoxStyle` | `PasswordBox` | true -> false | | `MaterialOutlinedPasswordBoxStyle` | `OutlinedPasswordBoxStyle` | `PasswordBox` | false -> true | | `MaterialFilledTextBoxStyle` | `FilledTextBoxStyle` | `TextBox` | true -> false | | `MaterialOutlinedTextBoxStyle` | `OutlinedTextBoxStyle` | `TextBox` | false -> true | | `MaterialTextToggleButtonStyle` | `TextToggleButtonStyle` | `ToggleButton` | true -> false | | `MaterialIconToggleButtonStyle` | `IconToggleButtonStyle` | `ToggleButton` | false -> true | ### Resources As a result of the Lightweight Styling support, many resource keys have been added as well as renamed. For a list of all the new resource keys, please refer to the [Lightweight Styling documentation](lightweight-styling.md#resource-keys). Along with the above list of new resource keys, below is a list of the resource keys that have been removed or renamed. > [!NOTE] > Most resources, including those that have been added or renamed, have now been placed inside of a `ThemeDictionary`. This means that the resources should now be referenced using the `ThemeResource` markup extension instead of `StaticResource`. For more information on theme resources, see [XAML theme resources documentation](https://learn.microsoft.com/windows/apps/design/style/xaml-theme-resources). #### Button | Old Key | New Key | Value | | ------------------------------------------ | ---------------------------------- | -------------- | | `MaterialButtonHorizontalContentAlignment` | `ButtonHorizontalContentAlignment` | `Center` | | `MaterialButtonVerticalContentAlignment` | `ButtonVerticalContentAlignment` | `Center` | | `MaterialButtonCornerRadius` | **_REMOVED_** | 20 | | `MaterialOutlinedButtonBorderThickness` | **_REMOVED_** | 1 | | `MaterialButtonBorderThickness` | **_REMOVED_** | 0 | | `MaterialTextButtonPadding` | **_REMOVED_** | 12,0 | | `MaterialButtonPadding` | **_REMOVED_** | 16,0 | | `MaterialButtonMinWidth` | **_REMOVED_** | 40 | | `MaterialButtonMinHeight` | **_REMOVED_** | 40 | | `MaterialOutlinedButtonBorderBrush` | **_REMOVED_** | `OutlineBrush` | | `MaterialNullToTextButtonMarginConverter` | `NullToTextButtonMarginConverter` | | #### CalendarDatePicker | Old Key | New Key | Value | | -------------------------------------- | ------------- | -------------------- | | `MaterialCalendarDatePickerBackground` | **_REMOVED_** | OnSurfaceColor\*0.12 | #### CheckBox | Old Key | New Key | Value | | ------------------------------ | ------------- | ---------------------------------------------------------------------------------------------------- | | `CheckAreaCornerRadius` | **_REMOVED_** | 4 | | `CheckAreaSize` | **_REMOVED_** | 18 | | `FocusAreaSize` | **_REMOVED_** | 40 | | `CheckAreaLength` | **_REMOVED_** | 40 | | `CheckBoxCheckGlyphPathStyle` | **_REMOVED_** | `M28.718018,0L32,3.2819897 10.666016,24.616999 0,13.951997 3.2810059,10.670007 10.666016,18.055033z` | | `CheckBoxHyphenGlyphPathStyle` | **_REMOVED_** | `M0,0L32,0 32,5.3 0,5.3z` | #### ComboBox | Old Key | New Key | Value | | --------------------------------------- | --------------------------- | --------------------- | | `MaterialComboBoxPadding` | **_REMOVED_** | 16,0 | | `MaterialComboBoxOpenedBorderThickness` | **_REMOVED_** | 2 | | `MaterialComboBoxBorderThickness` | **_REMOVED_** | 1 | | `DownArrowPathData` | `ComboBoxDownArrowPathData` | `M0 0L5 5L10 0H0Z` | | `UpArrowPathData` | `ComboBoxUpArrowPathData` | `M0 0L-5 -5L-10 0H0Z` | | `MaterialComboBoxCornerRadius` | **_REMOVED_** | 4 | #### DatePicker | Old Key | New Key | Value | | -------------------------------------------------- | ------------- | --------------------- | | `MaterialDatePickerBackgroundColorBrush` | **_REMOVED_** | OnSurfaceColor\*0.12 | | `MaterialDatePickerFlyoutPresenterSpacerFill` | **_REMOVED_** | OnSurfaceFocusedBrush | | `MaterialDatePickerFlyoutElevation` | **_REMOVED_** | 8 | | `MaterialDatePickerFlyoutPresenterHighlightFill` | **_REMOVED_** | PrimaryColor\*0.2 | | `MaterialDatePickerFlyoutPresenterBorderBrush` | **_REMOVED_** | OnSurfaceFocusedBrush | | `MaterialDatePickerHostPadding` | **_REMOVED_** | 24,24,8,8 | | `MaterialDatePickerFlyoutPresenterBackgroundBrush` | **_REMOVED_** | SurfaceBrush | | `MaterialDatePickerHeight` | **_REMOVED_** | 53 | | `MaterialDatePickerSpacerThemeWidth` | **_REMOVED_** | 1 | | `MaterialDateTimeFlyoutBorderThickness` | **_REMOVED_** | 1 | #### FloatingActionButton | Old Key | New Key | Value | | --------------------------------------------- | ------------- | ---------------------------------- | | `MaterialFabIconTextPadding` | **_REMOVED_** | 12 | | `MaterialLargeFabCornerRadius` | **_REMOVED_** | 28 | | `MaterialLargeFabContentWidthOrHeight` | **_REMOVED_** | 24 | | `MaterialLargeFabPadding` | **_REMOVED_** | 36 | | `MaterialSmallFabCornerRadius` | **_REMOVED_** | 12 | | `MaterialSmallFabContentWidthOrHeight` | **_REMOVED_** | 16 | | `MaterialSmallFabPadding` | **_REMOVED_** | 12 | | `MaterialFabCornerRadius` | **_REMOVED_** | 16 | | `MaterialFabContentWidthOrHeight` | **_REMOVED_** | 16 | | `MaterialFabPadding` | **_REMOVED_** | 20 | | `MaterialTertiaryFabDisabledStateOverlay` | **_REMOVED_** | `OnSurfaceDisabledLowBrush` | | `MaterialTertiaryFabPressedStateOverlay` | **_REMOVED_** | `OnTertiaryContainerFocusedBrush` | | `MaterialTertiaryFabFocusedStateOverlay` | **_REMOVED_** | `OnTertiaryContainerFocusedBrush` | | `MaterialTertiaryFabPointerOverStateOverlay` | **_REMOVED_** | `OnTertiaryContainerHoverBrush` | | `MaterialTertiaryFabDisabledForeground` | **_REMOVED_** | `OnSurfaceDisabledBrush` | | `MaterialTertiaryFabDisabledBackground` | **_REMOVED_** | `SystemControlTransparentBrush` | | `MaterialTertiaryFabBackground` | **_REMOVED_** | `TertiaryContainerBrush` | | `MaterialTertiaryFabForeground` | **_REMOVED_** | `OnTertiaryContainerBrush` | | `MaterialSecondaryFabDisabledStateOverlay` | **_REMOVED_** | `OnSurfaceDisabledLowBrush` | | `MaterialSecondaryFabPressedStateOverlay` | **_REMOVED_** | `OnSecondaryContainerPressedBrush` | | `MaterialSecondaryFabFocusedStateOverlay` | **_REMOVED_** | `OnSecondaryContainerFocusedBrush` | | `MaterialSecondaryFabPointerOverStateOverlay` | **_REMOVED_** | `OnSecondaryContainerHoverBrush` | | `MaterialSecondaryFabDisabledForeground` | **_REMOVED_** | `OnSurfaceDisabledBrush` | | `MaterialSecondaryFabDisabledBackground` | **_REMOVED_** | `SystemControlTransparentBrush` | | `MaterialSecondaryFabBackground` | **_REMOVED_** | `SecondaryContainerBrush` | | `MaterialSecondaryFabForeground` | **_REMOVED_** | `OnSecondaryContainerBrush` | | `MaterialSurfaceFabDisabledStateOverlay` | **_REMOVED_** | `OnSurfaceDisabledLowBrush` | | `MaterialSurfaceFabDisabledBackground` | **_REMOVED_** | `SystemControlTransparentBrush` | | `MaterialSurfaceFabPressedStateOverlay` | **_REMOVED_** | `PrimaryPressedBrush` | | `MaterialSurfaceFabFocusedStateOverlay` | **_REMOVED_** | `PrimaryFocusedBrush` | | `MaterialSurfaceFabPointerOverStateOverlay` | **_REMOVED_** | `PrimaryHoverBrush` | | `MaterialSurfaceFabDisabledForeground` | **_REMOVED_** | `OnSurfaceDisabledBrush` | | `MaterialSurfaceFabBackground` | **_REMOVED_** | SurfaceBrush | | `MaterialSurfaceFabForeground` | **_REMOVED_** | PrimaryBrush | | `MaterialFabDisabledStateOverlay` | **_REMOVED_** | `OnSurfaceDisabledLowBrush` | | `MaterialFabPressedStateOverlay` | **_REMOVED_** | `OnPrimaryContainerPressedBrush` | | `MaterialFabFocusedStateOverlay` | **_REMOVED_** | `OnPrimaryContainerFocusedBrush` | | `MaterialFabPointerOverStateOverlay` | **_REMOVED_** | `OnPrimaryContainerHoverBrush` | | `MaterialFabDisabledForeground` | **_REMOVED_** | `OnSurfaceDisabledBrush` | | `MaterialFabDisabledBackground` | **_REMOVED_** | `SystemControlTransparentBrush` | | `MaterialFabBackground` | **_REMOVED_** | `PrimaryContainerBrush` | | `MaterialFabForeground` | **_REMOVED_** | `OnPrimaryContainerBrush` | #### NavigationView | Old Key | New Key | Value | | ------------------------------------------------------------- | ------------- | --------------------------- | | `NavigationViewItemExpandedGlyph` | **_REMOVED_** | ? | | `NavigationViewItemExpandedGlyphFontSize` | **_REMOVED_** | 8 | | `NavigationViewItemChildrenMenuFlyoutPadding` | **_REMOVED_** | 0,8 | | `TopNavigationViewOverflowMenuPadding` | **_REMOVED_** | 0,8 | | `NavigationViewMinimalContentGridCornerRadius` | **_REMOVED_** | 0 | | `TopNavigationViewContentGridCornerRadius` | **_REMOVED_** | 0 | | `NavigationViewContentGridCornerRadius` | **_REMOVED_** | 8,0,0,0 | | `TopNavigationViewItemOnOverflowExpandChevronPadding` | **_REMOVED_** | 12,0 | | `TopNavigationViewItemOnOverflowExpandChevronMargin` | **_REMOVED_** | -4,0,-8,0 | | `TopNavigationViewItemOnOverflowNoIconContentPresenterMargin` | **_REMOVED_** | 16,0,20,0 | | `TopNavigationViewItemOnOverflowContentPresenterMargin` | **_REMOVED_** | 12,0,20,0 | | `TopNavigationViewItemContentOnlyExpandChevronMargin` | **_REMOVED_** | -12,0,0,0 | | `TopNavigationViewItemIconOnlyExpandChevronMargin` | **_REMOVED_** | 0 | | `TopNavigationViewItemExpandChevronMargin` | **_REMOVED_** | -16,0,0,0 | | `NavigationViewItemExpandChevronMargin` | **_REMOVED_** | 0,0,-14,0 | | `TopNavigationViewItemContentOnlyContentPresenterMargin` | **_REMOVED_** | 12,0 | | `TopNavigationViewItemContentPresenterMargin` | **_REMOVED_** | 8,-1,12,-1 | | `NavigationViewCompactItemContentPresenterMargin` | **_REMOVED_** | 0 | | `NavigationViewItemContentPresenterMargin` | **_REMOVED_** | 4,-1,8,-1 | | `TopNavigationViewOverflowButtonMargin` | **_REMOVED_** | 0 | | `TopNavigationViewItemSeparatorMargin` | **_REMOVED_** | 3,0,4,0 | | `NavigationViewCompactItemSeparatorMargin` | **_REMOVED_** | 0,3,0,4 | | `NavigationViewItemSeparatorMargin` | **_REMOVED_** | 0,3,0,4 | | `TopNavigationViewItemMargin` | **_REMOVED_** | 0 | | `NavigationViewItemMargin` | **_REMOVED_** | 0 | | `NavigationViewPaneTitlePresenterMargin` | **_REMOVED_** | 8,4,0,0 | | `TopNavigationViewContentMargin` | **_REMOVED_** | 0 | | `NavigationViewMinimalContentMargin` | **_REMOVED_** | 0 | | `NavigationViewContentMargin` | **_REMOVED_** | 0 | | `NavigationViewContentPresenterMargin` | **_REMOVED_** | 0 | | `NavigationViewHeaderMargin` | **_REMOVED_** | 56,44,0,0 | | `NavigationViewBorderThickness` | **_REMOVED_** | 1 | | `TopNavigationViewTopNavGridMargin` | **_REMOVED_** | 4,0 | | `TopNavigationViewContentGridBorderThickness` | **_REMOVED_** | 0,1,0,0 | | `NavigationViewMinimalContentGridBorderThickness` | **_REMOVED_** | 0,1,0,0 | | `NavigationViewContentGridBorderThickness` | **_REMOVED_** | 1,1,0,0 | | `NavigationViewPaneContentGridMargin` | **_REMOVED_** | -1,3 | | `NavigationViewButtonHolderGridMargin` | **_REMOVED_** | 0 | | `NavigationViewMinimalHeaderMargin` | **_REMOVED_** | -24,44,0,0 | | `TopNavigationViewItemInnerHeaderMargin` | **_REMOVED_** | 12,0 | | `NavigationViewItemInnerHeaderMargin` | **_REMOVED_** | 16,0 | | `NavigationViewItemButtonMargin` | **_REMOVED_** | 12,0 | | `NavigationViewItemOnLeftIconBoxMargin` | **_REMOVED_** | 3 | | `NavigationViewItemBorderThickness` | **_REMOVED_** | 1 | | `NavigationViewToggleBorderThickness` | **_REMOVED_** | 0 | | `TopNavigationViewItemSeparatorWidth` | **_REMOVED_** | 1 | | `NavigationViewItemSeparatorHeight` | **_REMOVED_** | 1 | | `NavigationViewSelectionIndicatorRadius` | **_REMOVED_** | 2 | | `NavigationViewSelectionIndicatorHeight` | **_REMOVED_** | 24 | | `NavigationViewSelectionIndicatorWidth` | **_REMOVED_** | 3 | | `NavigationViewItemOnLeftIconBoxHeight` | **_REMOVED_** | 24 | | `NavigationViewPaneHeaderRowMinHeight` | **_REMOVED_** | 56 | | `NavigationViewItemOnLeftMinHeight` | **_REMOVED_** | 56 | | `TopNavigationViewSettingsButtonHeight` | **_REMOVED_** | 40 | | `TopNavigationViewSettingsButtonWidth` | **_REMOVED_** | 40 | | `TopNavigationViewOverflowButtonHeight` | **_REMOVED_** | 40 | | `TopNavigationViewOverflowButtonWidth` | **_REMOVED_** | 40 | | `TopNavigationViewPaneCustomContentMinWidth` | **_REMOVED_** | 80 | | `NavigationViewAutoSuggestAreaHeight` | **_REMOVED_** | 40 | | `NavigationViewTopPaneHeight` | **_REMOVED_** | 48 | | `NavigationViewIconBoxWidth` | **_REMOVED_** | 40 | | `NavigationViewCompactPaneLength` | **_REMOVED_** | 80 | | `PaneToggleButtonWidth` | **_REMOVED_** | 80 | | `PaneToggleButtonHeight` | **_REMOVED_** | 56 | | `TopNavigationViewAutoSuggestBoxMargin` | **_REMOVED_** | 4,0 | | `NavigationViewAutoSuggestBoxMargin` | **_REMOVED_** | 16,0 | | `MaterialNavigationViewItemRippleFeedback` | **_REMOVED_** | `PrimaryPressedBrush` | | `MaterialNavigationViewItemBackgroundDisabled` | **_REMOVED_** | `OnSurfaceDisabledLowBrush` | | `MaterialNavigationViewItemBackgroundPointerOver` | **_REMOVED_** | `PrimaryHoverBrush` | | `MaterialNavigationViewItemBackgroundPressed` | **_REMOVED_** | `PrimaryPressedBrush` | | `MaterialNavigationViewItemBackgroundSelected` | **_REMOVED_** | `PrimarySelectedBrush` | | `MaterialNavigationItemContentMarginWithoutIcon` | **_REMOVED_** | 0 | | `MaterialNavigationItemContentMargin` | **_REMOVED_** | 12,0,0,0 | | `MaterialNavigationItemIconLength` | **_REMOVED_** | 24 | | `MaterialNavigationItemLeftMargin` | **_REMOVED_** | 12,0 | | `MaterialNavigationViewItemCornerRadiusLeftOnly` | **_REMOVED_** | 28,0,0,28 | | `MaterialNavigationViewItemCornerRadius` | **_REMOVED_** | 28 | | `MaterialNavigationItemHeight` | **_REMOVED_** | 56 | | `MaterialNavigationViewButtonRippleFeedback` | **_REMOVED_** | `PrimaryPressedBrush` | | `MaterialNavigationViewButtonBackgroundPointerOver` | **_REMOVED_** | `PrimaryHoverBrush` | | `MaterialNavigationViewButtonBackgroundPressed` | **_REMOVED_** | `PrimaryPressedBrush` | | `MaterialNavigationViewButtonForegroundDisabled` | **_REMOVED_** | `OnSurfaceDisabledLowBrush` | | `MaterialNavigationViewButtonMarginWhenStackedVertically` | **_REMOVED_** | 12,0 | | `MaterialNavigationViewButtonIconSymbolFontSize` | **_REMOVED_** | 24 | | `MaterialNavigationViewButtonIconLength` | **_REMOVED_** | 24 | | `MaterialNavigationViewButtonCornerRadius` | **_REMOVED_** | 28 | | `MaterialNavigationViewButtonWidth` | **_REMOVED_** | 56 | | `MaterialNavigationViewContentGridCornerRadius` | **_REMOVED_** | 14,0,0,14 | | `MaterialNavigationViewSplitViewCornerRadius` | **_REMOVED_** | 0,14,14,0 | | `MaterialNavigationViewPaneBackground` | **_REMOVED_** | `SurfaceBrush` | | `MaterialNavigationViewBackground` | **_REMOVED_** | `SurfaceBrush` | #### PasswordBox | Old Key | New Key | Value | | ------------------------------------------------ | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `MaterialDisabledOutlinedPasswordBoxBorderBrush` | **_REMOVED_** | OnSurfaceColor\*0.12 | | `MaterialRevealGlyphPathData` | **_REMOVED_** | `M11 0.5C6 0.5 1.73 3.61 0 8C1.73 12.39 6 15.5 11 15.5C16 15.5 20.27 12.39 22 8C20.27 3.61 16 0.5 11 0.5ZM11 13C8.24 13 6 10.76 6 8C6 5.24 8.24 3 11 3C13.76 3 16 5.24 16 8C16 10.76 13.76 13 11 13ZM11 5C9.34 5 8 6.34 8 8C8 9.66 9.34 11 11 11C12.66 11 14 9.66 14 8C14 6.34 12.66 5 11 5Z` | #### PipsPager | Old Key | New Key | Value | | ------------------------------------------------------ | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `MaterialPipsPagerNormalEllipseSize` | **_REMOVED_** | 8 | | `MaterialPipsPagerSelectedEllipseSize` | **_REMOVED_** | 8 | | `MaterialPipsPagerNavigationVisualStatesEllipseHeight` | **_REMOVED_** | 12 | | `MaterialPipsPagerNavigationVisualStatesEllipseWidth` | **_REMOVED_** | 12 | | `MaterialPipsPagerNavigationButtonWidth` | **_REMOVED_** | 40 | | `MaterialPipsPagerNavigationButtonHeight` | **_REMOVED_** | 40 | | `MaterialPipsPagerNextPageButtonData` | **_REMOVED_** | `M4.66319 5.67785C4.36844 6.10738 3.63156 6.10738 3.33681 5.67785L0.103738 0.966444C-0.191015 0.536913 0.177425 6.83871e-07 0.766931 6.32335e-07L7.23307 6.70473e-08C7.82257 1.55111e-08 8.19101 0.536912 7.89626 0.966443L4.66319 5.67785Z` | | `MaterialPipsPagerPreviousPageButtonData` | **_REMOVED_** | `M3.33681 0.322148C3.63156 -0.107383 4.36844 -0.107382 4.66319 0.322148L7.89626 5.03356C8.19101 5.46309 7.82257 6 7.23307 6L0.766932 6C0.177427 6 -0.191014 5.46309 0.103739 5.03356L3.33681 0.322148Z` | | `MaterialPipsPagerNavigationButtonBorderThickness` | **_REMOVED_** | 0 | | `MaterialPipsPagerButtonBorderThickness` | **_REMOVED_** | 0 | | `MaterialPipsPagerVerticalOrientationButtonHeight` | **_REMOVED_** | 12 | | `MaterialPipsPagerVerticalOrientationButtonWidth` | **_REMOVED_** | 12 | | `MaterialPipsPagerHorizontalOrientationButtonHeight` | **_REMOVED_** | 12 | | `MaterialPipsPagerHorizontalOrientationButtonWidth` | **_REMOVED_** | 12 | #### ProgressBar | Old Key | New Key | Value | | ----------------------------- | ------------- | ----- | | `MaterialProgressBarHeight` | **_REMOVED_** | 4 | | `MaterialProgressBarMinWidth` | **_REMOVED_** | 250 | #### ProgressRing | Old Key | New Key | Value | | -------------------------------------- | ------------- | ------------------------------------------------------------------------ | | `M3MaterialIndeterminateAnimation_Uno` | **_REMOVED_** | `embedded://Uno.Material/Uno.Material.Assets.MaterialIndeterminate.json` | | `M3MaterialDeterminateAnimation_Uno` | **_REMOVED_** | `embedded://Uno.Material/Uno.Material.Assets.MaterialDeterminate.json` | | `M3MaterialIndeterminateAnimation_Win` | **_REMOVED_** | `ms-appx:///Uno.Material/Assets/MaterialIndeterminate.json` | | `M3MaterialDeterminateAnimation_Win` | **_REMOVED_** | `ms-appx:///Uno.Material/Assets/MaterialDeterminate.json` | #### RadioButton | Old Key | New Key | Value | | ----------------------- | ------------- | ----- | | `RadioBorderThickness` | **_REMOVED_** | 2 | | `RadioCheckAreaSize` | **_REMOVED_** | 20 | | `RadioStatesAreaSize` | **_REMOVED_** | 40 | | `RadioStatesAreaLength` | **_REMOVED_** | 40 | #### Slider | Old Key | New Key | Value | | --------------------------------------- | ------------- | ---------------------------------------------- | | `MaterialSliderThumbBackgroundDisabled` | **_REMOVED_** | `SystemControlDisabledChromeDisabledHighBrush` | | `MaterialSliderInlineTickBarFill` | **_REMOVED_** | `SystemControlBackgroundAltHighBrush` | | `MaterialSliderTickBarFillDisabled` | **_REMOVED_** | `SystemControlDisabledBaseMediumLowBrush` | | `MaterialSliderTickBarFill` | **_REMOVED_** | `OnSecondaryLowBrush` | | `MaterialSliderTrackBrush` | **_REMOVED_** | `MaterialSliderTrackColor` | #### TextBox | Old Key | New Key | Value | | -------------------------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `MaterialDisabledOutlinedTextBoxBorderBrush` | **_REMOVED_** | OnSurfaceColor\*0.12 | | `M3ClearGlyphPathData` | **_REMOVED_** | `M10 0C4.47 0 0 4.47 0 10C0 15.53 4.47 20 10 20C15.53 20 20 15.53 20 10C20 4.47 15.53 0 10 0ZM10 18C5.59 18 2 14.41 2 10C2 5.59 5.59 2 10 2C14.41 2 18 5.59 18 10C18 14.41 14.41 18 10 18ZM10 8.59L13.59 5L15 6.41L11.41 10L15 13.59L13.59 15L10 11.41L6.41 15L5 13.59L8.59 10L5 6.41L6.41 5L10 8.59Z` | #### ToggleButton | Old Key | New Key | Value | | ------------------------------------------ | ------------- | ---------------- | | `MaterialToggleButtonPadding` | **_REMOVED_** | 16,8 | | `MaterialToggleButtonBorderRadius` | **_REMOVED_** | 4 | | `MaterialToggleButtonForegroundThemeBrush` | **_REMOVED_** | `OnSurfaceBrush` | | `MaterialToggleButtonTextLabelBrush` | **_REMOVED_** | `PrimaryColor` | #### ToggleSwitch | Old Key | New Key | Value | | ------------------------------------------ | ------------- | ------------------------------------- | | `MaterialPrimaryVariantLowThumbColorBrush` | **_REMOVED_** | `MaterialPrimaryVariantLowThumbColor` | | `MaterialToggleSwitchOnLowBackgroundBrush` | **_REMOVED_** | `OnSurfaceSelectedBrush` | | `MaterialToggleSwitchOnLowButtonBrush` | **_REMOVED_** | `OnSurfaceSelectedBrush` | | `MaterialToggleSwitchOffBackgroundBrush` | **_REMOVED_** | `OnSurfaceLowBrush` | | `MaterialToggleSwitchOffButtonBrush` | **_REMOVED_** | `OnPrimaryBrush` | | `MaterialToggleSwitchOnBackgroundBrush` | **_REMOVED_** | `PrimaryVariantLightBrush` | | `MaterialToggleSwitchOnButtonBrush` | **_REMOVED_** | `PrimaryBrush` | | `MaterialToggleSwitchHeaderMargin` | **_REMOVED_** | 0,0,12,0 | ## Upgrading to Uno.Material v2 Starting with version 2.0.0 of the [Uno.Material](https://www.nuget.org/packages/Uno.Material/2.0.0) and [Uno.Material.WinUI](https://www.nuget.org/packages/Uno.Material.WinUI/2.0.0) packages, users can now take advantage of the new [Material Design 3](https://m3.material.io/) design system from Google. Along with the new Material Design 3 styles, our Uno.Material NuGet packages will continue to support the previous Material Design 2 styles. In order to achieve this backward compatibility, we have had to make some changes to the way Uno.Material is initialized within your `App.xaml`. > [!NOTE] > In order to avoid any confusion going forward in this article, we will be referring to the new collection of Material Design 3 styles as the "v2" styles and the previous collection of Material Design 2 styles will be referred to as the "v1" styles. There are two available paths once you have updated to the new Uno.Material v2 package: - Continue to keep using the v1 styles; or, - Migrate app to reference the new v2 styles ### Continue Using v1 Styles > [!WARNING] > In order to continue using the v1 styles, some changes are required in your `App.xaml`. The Uno.Material v2 NuGet package contains both sets of v1 and v2 styles. Within your `App.xaml`, you will need to replace the references to `MaterialColors` and `MaterialResources` with `MaterialColorsV1` and `MaterialResourcesV1`. `MaterialFonts` remains unchanged. ### Migrating to v2 Styles Both `MaterialColors` and `MaterialResources` will now always initialize the latest version of the Material styles. It is also possible to directly reference the `MaterialColorsV2` and `MaterialResourcesV2` ResourceDictionaries if needed. The v2 styles introduce a new naming system for its resource keys. Refer to the [Material Styles Matrix](#Uno.Themes.Material.Styles) for the updated style keys. In addition to the new style keys, the Uno.Material color palette and text resources have also been updated to align with the [Material Design 3 Color System](https://m3.material.io/styles/color/the-color-system/key-colors-tones) and the [Material Design 3 Typography Guidelines](https://m3.material.io/styles/typography/type-scale-tokens). #### Color Update A new color palette has been created for v2, meaning any color palette overrides ResourceDictionary in your app must be updated with the new resource keys. An example of the new color palette can be seen in the new [Uno.Material default palette](https://github.com/unoplatform/Uno.Themes/blob/master/src/library/Uno.Themes/Styles/Applications/Common/SharedColorPalette.xaml#L4). For more information on the updated colors, you can refer to the "Colors and Themes" section of the [Material 3 Migration Guide](https://material.io/blog/migrating-material-3). > [!NOTE] > As of v2, the Brush resources have been relocated to `ThemeDictionaries`. To reference these Brush resources, use the `ThemeResource` binding. > More information on theme resources can be found in [XAML theme resources documentation](https://learn.microsoft.com/windows/apps/design/style/xaml-theme-resources). #### Typography Updates Text styles have also been modified in v2. There is no 1-to-1 mapping between v1 and v2 text styles in terms of font-sizes and usages. The "Typography" section of the [Material 3 Migration Guide](https://material.io/blog/migrating-material-3) can be helpful for choosing the right style. Below is a table that is not a strict guideline, but, is provided to you as a suggestion of mapping text styles from v1 to v2: | Previous Style | New Style | | -------------------- | ------------------------- | | `MaterialHeadline1` | `MaterialDisplaySmall` | | `MaterialHeadline2` | `MaterialHeadlineLarge` | | `MaterialHeadline3` | `MaterialHeadlineMedium` | | `MaterialHeadline4` | `MaterialHeadlineSmall` | | `MaterialHeadline5` | `MaterialTitleLarge` | | `MaterialSubtitle1` | `MaterialTitleMedium` | | `MaterialSubtitle2` | `MaterialTitleSmall` | | `MaterialBody1` | `MaterialBodyLarge` | | `MaterialBody2` | `MaterialBodyMedium` | | `MaterialCaption` | `MaterialBodySmall` | | `MaterialButtonText` | `MaterialLabelLarge` | | `MaterialOverline` | `MaterialLabelMedium` | | N/A | `MaterialLabelSmall` | | N/A | `MaterialLabelExtraSmall` | | N/A | `MaterialCaptionLarge` | | N/A | `MaterialCaptionMedium` | | N/A | `MaterialCaptionSmall` | | N/A | `MaterialDisplayLarge` | | N/A | `MaterialDisplayMedium` | #### Notable Style Key Changes | Control | Previous Style Key | New Style Key | | -------------- | ------------------------------- | ------------------------------- | | `Button` | `MaterialButtonIconStyle` | `MaterialIconButtonStyle` | | `Button` | `MaterialContainedButtonStyle` | `MaterialFilledButtonStyle` | | `ToggleButton` | `MaterialToggleButtonIconStyle` | `MaterialIconToggleButtonStyle` | #### Notable Package Changes | Namespace | Previous Package | New Package | | ------------------------ | ------------------------- | -------------- | | `ControlExtensions.Icon` | `Uno.Material.Extensions` | `Uno.Material` | | `Ripple` | `Uno.Material.Controls` | `Uno.Material` | ## Uno.Themes.Styles.AppBarButton # AppBarButton Control ## Styles | Style Key | IsDefaultStyle\* | |--------------------------|------------------| | `AppBarButtonStyle` | True | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | |-------------------------------------------------------|-------------------|------------------------------------| | `AppBarButtonHeight` | `Double` | `64` | | `AppBarButtonWidth` | `Double` | `64` | ## Uno.Themes.Styles.Button # Button Control ## Styles | Style Key | IsDefaultStyle\* | |--------------------------|------------------| | `ElevatedButtonStyle` | | | `FilledButtonStyle` | True | | `FilledTonalButtonStyle` | | | `OutlinedButtonStyle` | | | `TextButtonStyle` | | | `IconButtonStyle` | | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | | -------------------------------------------------- | ----------------- | ---------------------------------- | | `ElevatedButtonForeground` | `SolidColorBrush` | `PrimaryBrush` | | `ElevatedButtonForegroundPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `ElevatedButtonForegroundPressed` | `SolidColorBrush` | `PrimaryBrush` | | `ElevatedButtonForegroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `ElevatedButtonIconForeground` | `SolidColorBrush` | `PrimaryBrush` | | `ElevatedButtonIconForegroundPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `ElevatedButtonIconForegroundPressed` | `SolidColorBrush` | `PrimaryBrush` | | `ElevatedButtonIconForegroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `ElevatedButtonBackground` | `SolidColorBrush` | `SurfaceBrush` | | `ElevatedButtonBackgroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `ElevatedButtonBackgroundPointerOver` | `SolidColorBrush` | `SurfaceBrush` | | `ElevatedButtonBackgroundPressed` | `SolidColorBrush` | `SurfaceBrush` | | `ElevatedButtonBorderBrush` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ElevatedButtonBorderBrushPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ElevatedButtonBorderBrushPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ElevatedButtonBorderBrushDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ElevatedButtonStateLayerBackgroundPointerOver` | `SolidColorBrush` | `PrimaryHoverBrush` | | `ElevatedButtonStateLayerBackgroundPressed` | `SolidColorBrush` | `PrimaryPressedBrush` | | `FilledButtonForeground` | `SolidColorBrush` | `OnPrimaryBrush` | | `FilledButtonForegroundPointerOver` | `SolidColorBrush` | `OnPrimaryBrush` | | `FilledButtonForegroundPressed` | `SolidColorBrush` | `OnPrimaryBrush` | | `FilledButtonForegroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `FilledButtonIconForeground` | `SolidColorBrush` | `OnPrimaryBrush` | | `FilledButtonIconForegroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `FilledButtonIconForegroundPointerOver` | `SolidColorBrush` | `OnPrimaryBrush` | | `FilledButtonIconForegroundPressed` | `SolidColorBrush` | `OnPrimaryBrush` | | `FilledButtonBackground` | `SolidColorBrush` | `PrimaryBrush` | | `FilledButtonBackgroundPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `FilledButtonBackgroundPressed` | `SolidColorBrush` | `PrimaryBrush` | | `FilledButtonBackgroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `FilledButtonBorderBrush` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FilledButtonBorderBrushPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FilledButtonBorderBrushPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FilledButtonBorderBrushDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FilledButtonStateLayerBackgroundPointerOver` | `SolidColorBrush` | `OnPrimaryHoverBrush` | | `FilledButtonStateLayerBackgroundPressed` | `SolidColorBrush` | `OnPrimaryPressedBrush` | | `FilledTonalButtonForeground` | `SolidColorBrush` | `OnSecondaryContainerBrush` | | `FilledTonalButtonForegroundPointerOver` | `SolidColorBrush` | `OnSecondaryContainerBrush` | | `FilledTonalButtonForegroundPressed` | `SolidColorBrush` | `OnSecondaryContainerBrush` | | `FilledTonalButtonForegroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `FilledTonalButtonIconForeground` | `SolidColorBrush` | `OnSecondaryContainerBrush` | | `FilledTonalButtonIconForegroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `FilledTonalButtonIconForegroundPointerOver` | `SolidColorBrush` | `OnSecondaryContainerBrush` | | `FilledTonalButtonIconForegroundPressed` | `SolidColorBrush` | `OnSecondaryContainerBrush` | | `FilledTonalButtonBackground` | `SolidColorBrush` | `SecondaryContainerBrush` | | `FilledTonalButtonBackgroundPointerOver` | `SolidColorBrush` | `SecondaryContainerBrush` | | `FilledTonalButtonBackgroundPressed` | `SolidColorBrush` | `SecondaryContainerBrush` | | `FilledTonalButtonBackgroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `FilledTonalButtonBorderBrush` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FilledTonalButtonBorderBrushPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FilledTonalButtonBorderBrushPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FilledTonalButtonBorderBrushDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FilledTonalButtonStateLayerBackgroundPointerOver` | `SolidColorBrush` | `OnSecondaryContainerHoverBrush` | | `FilledTonalButtonStateLayerBackgroundPressed` | `SolidColorBrush` | `OnSecondaryContainerPressedBrush` | | `OutlinedButtonForeground` | `SolidColorBrush` | `PrimaryBrush` | | `OutlinedButtonForegroundPressed` | `SolidColorBrush` | `PrimaryBrush` | | `OutlinedButtonForegroundPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `OutlinedButtonForegroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `OutlinedButtonIconForeground` | `SolidColorBrush` | `PrimaryBrush` | | `OutlinedButtonIconForegroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `OutlinedButtonIconForegroundPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `OutlinedButtonIconForegroundPressed` | `SolidColorBrush` | `PrimaryBrush` | | `OutlinedButtonBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `OutlinedButtonBackgroundPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `OutlinedButtonBackgroundPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `OutlinedButtonBackgroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `OutlinedButtonBorderBrush` | `SolidColorBrush` | `OutlineBrush` | | `OutlinedButtonBorderBrushPointerOver` | `SolidColorBrush` | `OutlineBrush` | | `OutlinedButtonBorderBrushPressed` | `SolidColorBrush` | `OutlineBrush` | | `OutlinedButtonBorderBrushDisabled` | `SolidColorBrush` | `OutlineDisabledBrush` | | `OutlinedButtonStateLayerBackgroundPointerOver` | `SolidColorBrush` | `PrimaryHoverBrush` | | `OutlinedButtonStateLayerBackgroundPressed` | `SolidColorBrush` | `PrimaryPressedBrush` | | `TextButtonForeground` | `SolidColorBrush` | `PrimaryBrush` | | `TextButtonForegroundPressed` | `SolidColorBrush` | `PrimaryBrush` | | `TextButtonForegroundPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `TextButtonForegroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `TextButtonIconForeground` | `SolidColorBrush` | `PrimaryBrush` | | `TextButtonIconForegroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `TextButtonIconForegroundPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `TextButtonIconForegroundPressed` | `SolidColorBrush` | `PrimaryBrush` | | `TextButtonBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextButtonBackgroundPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextButtonBackgroundPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextButtonBorderBrush` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextButtonBorderBrushPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextButtonBorderBrushPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextButtonBorderBrushDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextButtonStateLayerBackgroundPointerOver` | `SolidColorBrush` | `PrimaryHoverBrush` | | `TextButtonStateLayerBackgroundPressed` | `SolidColorBrush` | `PrimaryPressedBrush` | | `IconButtonForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `IconButtonForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `IconButtonEllipseFillPointerOver` | `SolidColorBrush` | `PrimaryHoverBrush` | | `IconButtonEllipseFillPressed` | `SolidColorBrush` | `PrimaryPressedBrush` | | `IconButtonEllipseFillFocused` | `SolidColorBrush` | `PrimaryFocusedBrush` | | `ButtonMinHeight` | `Double` | 40 | | `ButtonMinWidth` | `Double` | 40 | | `ButtonIconMinWidth` | `Double` | 18 | | `ElevatedButtonElevation` | `Double` | 1 | | `ElevatedButtonElevationDisabled` | `Double` | 0 | | `ButtonElevation` | `Double` | 0 | | `IconButtonOpacityVisibleState` | `Double` | 1 | | `IconButtonOpacityHiddenState` | `Double` | 0 | | `ButtonPadding` | `Thickness` | 16,0 | | `TextButtonPadding` | `Thickness` | 12,0 | | `TextButtonIconMargin` | `Thickness` | 0,0,8,0 | | `ButtonBorderThickness` | `Thickness` | 0 | | `OutlinedButtonBorderThickness` | `Thickness` | 1 | | `ElevatedButtonMargin` | `Thickness` | 0,0,0,1 | | `ElevatedButtonDisabledMargin` | `Thickness` | 0 | | `ButtonContentMargin` | `Thickness` | 8,0 | | `ButtonMargin` | `Thickness` | 0 | | `ButtonCornerRadius` | `CornerRadius` | 20 | ## Uno.Themes.Styles.CalendarDatePicker # CalendarDatePicker Control ## Styles | Style Key | IsDefaultStyle\* | |---------------------------|------------------| | `CalendarDatePickerStyle` | True | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | |-----------------------------------------------------|-------------------|---------------------------------| | `CalendarDatePickerBackgroundCornerRadius` | `CornerRadius` | 4,4,0,0 | | `CalendarDatePickerBorderThemeThickness` | `Thickness` | 1 | | `CalendarDatePickerFlyoutPresenterPadding` | `Thickness` | 0 | | `CalendarDatePickerFlyoutPresenterMargin` | `Thickness` | 0 | | `CalendarDatePickerContentMargin` | `Thickness` | 10,0 | | `CalendarDatePickerHeight` | `Double` | 53 | | `CalendarDatePickerBackgroundMinHeight` | `Double` | 53 | | `CalendarDatePickerCornerRadius` | `CornerRadius` | `ControlCornerRadius` | | `CalendarDatePickerFlyoutPresenterCornerRadius` | `CornerRadius` | `OverlayCornerRadius` | | `CalendarDatePickerCalendarViewCornerRadius` | `CornerRadius` | `OverlayCornerRadius` | | `CalendarDatePickerForeground` | `SolidColorBrush` | `OnSurfaceBrush` | | `CalendarDatePickerForegroundDisabled` | `SolidColorBrush` | `OnSurfaceMediumBrush` | | `CalendarDatePickerCalendarGlyphForeground` | `SolidColorBrush` | `OnSurfaceBrush` | | `CalendarDatePickerCalendarGlyphForegroundDisabled` | `SolidColorBrush` | `OnSurfaceMediumBrush` | | `CalendarDatePickerTextForeground` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `CalendarDatePickerTextForegroundDisabled` | `SolidColorBrush` | `OnSurfaceMediumBrush` | | `CalendarDatePickerTextForegroundSelected` | `SolidColorBrush` | `OnSurfaceBrush` | | `CalendarDatePickerHeaderForeground` | `SolidColorBrush` | `PrimaryBrush` | | `CalendarDatePickerHeaderForegroundDisabled` | `SolidColorBrush` | `OnSurfaceMediumBrush` | | `CalendarDatePickerBackground` | `SolidColorBrush` | `SurfaceVariantBrush` | | `CalendarDatePickerBackgroundPointerOver` | `SolidColorBrush` | `SurfaceVariantBrush` | | `CalendarDatePickerBackgroundPressed` | `SolidColorBrush` | `SurfaceVariantBrush` | | `CalendarDatePickerBackgroundDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CalendarDatePickerBackgroundFocused` | `SolidColorBrush` | `SurfaceVariantBrush` | | `CalendarDatePickerBorderBrush` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `CalendarDatePickerBorderBrushPointerOver` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `CalendarDatePickerBorderBrushPressed` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `CalendarDatePickerBorderBrushDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `CalendarDatePickerBottomBorderBrush` | `SolidColorBrush` | `PrimaryBrush` | | `CalendarDatePickerHeaderStyle` | `Style` | `MaterialBodySmall` | | `CalendarDatePickerTextStyle` | `Style` | `MaterialBodyMedium` | ## Uno.Themes.Styles.CheckBox # CheckBox Control ## Styles | Style Key | IsDefaultStyle\* | |-----------------|------------------| | `CheckBoxStyle` | True | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | |---------------------------------------------------------|-------------------|------------------------------------------------------------------------------------------------------| | `CheckBoxBackgroundUnchecked` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBackgroundUncheckedPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBackgroundUncheckedPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBackgroundUncheckedDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBackgroundChecked` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBackgroundCheckedPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBackgroundCheckedPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBackgroundCheckedDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBackgroundIndeterminate` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBackgroundIndeterminatePointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBackgroundIndeterminatePressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBackgroundIndeterminateDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxForegroundUnchecked` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `CheckBoxForegroundUncheckedPointerOver` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `CheckBoxForegroundUncheckedPressed` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `CheckBoxForegroundUncheckedDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `CheckBoxForegroundChecked` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `CheckBoxForegroundCheckedPointerOver` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `CheckBoxForegroundCheckedPressed` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `CheckBoxForegroundCheckedDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `CheckBoxForegroundIndeterminate` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `CheckBoxForegroundIndeterminatePointerOver` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `CheckBoxForegroundIndeterminatePressed` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `CheckBoxForegroundIndeterminateDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `CheckBoxBorderBrushUnchecked` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBorderBrushUncheckedPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBorderBrushUncheckedPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBorderBrushUncheckedDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBorderBrushChecked` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBorderBrushCheckedPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBorderBrushCheckedPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBorderBrushCheckedDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBorderBrushIndeterminate` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBorderBrushIndeterminatePointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBorderBrushIndeterminatePressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxBorderBrushIndeterminateDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxCheckBackgroundStrokeUnchecked` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `CheckBoxCheckBackgroundStrokeUncheckedPointerOver` | `SolidColorBrush` | `OnSurfaceBrush` | | `CheckBoxCheckBackgroundStrokeUncheckedPressed` | `SolidColorBrush` | `OnSurfaceBrush` | | `CheckBoxCheckBackgroundStrokeUncheckedDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `CheckBoxCheckBackgroundStrokeChecked` | `SolidColorBrush` | `PrimaryBrush` | | `CheckBoxCheckBackgroundStrokeCheckedPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `CheckBoxCheckBackgroundStrokeCheckedPressed` | `SolidColorBrush` | `PrimaryBrush` | | `CheckBoxCheckBackgroundStrokeCheckedDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `CheckBoxCheckBackgroundStrokeIndeterminate` | `SolidColorBrush` | `PrimaryBrush` | | `CheckBoxCheckBackgroundStrokeIndeterminatePointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `CheckBoxCheckBackgroundStrokeIndeterminatePressed` | `SolidColorBrush` | `PrimaryBrush` | | `CheckBoxCheckBackgroundStrokeIndeterminateDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `CheckBoxCheckBackgroundFillUnchecked` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxCheckBackgroundFillUncheckedPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxCheckBackgroundFillUncheckedPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxCheckBackgroundFillUncheckedDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxCheckBackgroundFillChecked` | `SolidColorBrush` | `PrimaryBrush` | | `CheckBoxCheckBackgroundFillCheckedPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `CheckBoxCheckBackgroundFillCheckedPressed` | `SolidColorBrush` | `PrimaryBrush` | | `CheckBoxCheckBackgroundFillCheckedDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `CheckBoxCheckBackgroundFillIndeterminate` | `SolidColorBrush` | `PrimaryBrush` | | `CheckBoxCheckBackgroundFillIndeterminatePointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `CheckBoxCheckBackgroundFillIndeterminatePressed` | `SolidColorBrush` | `PrimaryBrush` | | `CheckBoxCheckBackgroundFillIndeterminateDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `CheckBoxFontFamily` | `FontFamily` | `BodySmallFontFamily` | | `CheckBoxFontWeight` | `String` | `BodySmallFontWeight` | | `CheckBoxFontSize` | `Double` | `BodySmallFontSize` | | `CheckBoxCharacterSpacing` | `Int32` | `BodySmallCharacterSpacing` | | `CheckBoxGlyphForegroundUnchecked` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxGlyphForegroundUncheckedPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxGlyphForegroundUncheckedPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxGlyphForegroundUncheckedDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `CheckBoxGlyphForegroundChecked` | `SolidColorBrush` | `OnPrimaryBrush` | | `CheckBoxGlyphForegroundCheckedPointerOver` | `SolidColorBrush` | `OnPrimaryBrush` | | `CheckBoxGlyphForegroundCheckedPressed` | `SolidColorBrush` | `OnPrimaryBrush` | | `CheckBoxGlyphForegroundCheckedDisabled` | `SolidColorBrush` | `OnPrimaryBrush` | | `CheckBoxGlyphForegroundIndeterminate` | `SolidColorBrush` | `OnPrimaryBrush` | | `CheckBoxGlyphForegroundIndeterminatePointerOver` | `SolidColorBrush` | `OnPrimaryBrush` | | `CheckBoxGlyphForegroundIndeterminatePressed` | `SolidColorBrush` | `OnPrimaryBrush` | | `CheckBoxGlyphForegroundIndeterminateDisabled` | `SolidColorBrush` | `OnPrimaryBrush` | | `CheckBoxHyphenGlyphPathData` | `String` | `M0,0L32,0 32,5.3 0,5.3z` | | `CheckBoxCheckGlyphPathData` | `String` | `M28.718018,0L32,3.2819897 10.666016,24.616999 0,13.951997 3.2810059,10.670007 10.666016,18.055033z` | | `CheckBoxStateCircleFillUnchecked` | `SolidColorBrush` | `OnSurfaceBrush` | | `CheckBoxStateCircleFillChecked` | `SolidColorBrush` | `PrimaryBrush` | | `CheckBoxStateCircleOpacityPointerOver` | `Double` | `HoverOpacity` | | `CheckBoxStateCircleOpacityPressed` | `Double` | `PressedOpacity` | | `CheckBoxStateCircleOpacityFocused` | `Double` | `FocusedOpacity` | | `CheckBoxFocusAreaSize` | `Double` | 40 | | `CheckBoxCheckAreaSize` | `Double` | 18 | | `CheckBoxCheckAreaLength` | `GridLength` | 40 | | `CheckBoxCheckAreaCornerRadius` | `CornerRadius` | 2 | | `CheckBoxCheckAreaBorderThickness` | `Thickness` | 2 | | `CheckBoxCheckAreaPadding` | `Thickness` | 8,0,0,0 | ## Uno.Themes.Styles.ComboBox # ComboBox Control ## Styles | Style Key | IsDefaultStyle\* | |-----------------|------------------| | `ComboBoxStyle` | True | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | |----------------------------------------------------|-------------------|---------------------------------| | `ComboBoxItemForeground` | `SolidColorBrush` | `OnSurfaceBrush` | | `ComboBoxItemForegroundPressed` | `SolidColorBrush` | `OnSurfaceBrush` | | `ComboBoxItemForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceBrush` | | `ComboBoxItemForegroundDisabled` | `SolidColorBrush` | `OnSurfaceBrush` | | `ComboBoxItemForegroundSelected` | `SolidColorBrush` | `OnSurfaceBrush` | | `ComboBoxItemForegroundSelectedUnfocused` | `SolidColorBrush` | `OnSurfaceBrush` | | `ComboBoxItemForegroundSelectedPressed` | `SolidColorBrush` | `OnSurfaceBrush` | | `ComboBoxItemForegroundSelectedPointerOver` | `SolidColorBrush` | `OnSurfaceBrush` | | `ComboBoxItemForegroundSelectedDisabled` | `SolidColorBrush` | `OnSurfaceBrush` | | `ComboBoxItemBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxItemBackgroundPressed` | `SolidColorBrush` | `OnSurfaceVariantHoverBrush` | | `ComboBoxItemBackgroundPointerOver` | `SolidColorBrush` | `OnSurfaceVariantHoverBrush` | | `ComboBoxItemBackgroundDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxItemBackgroundSelected` | `SolidColorBrush` | `PrimarySelectedBrush` | | `ComboBoxItemBackgroundSelectedUnfocused` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxItemBackgroundSelectedPressed` | `SolidColorBrush` | `PrimarySelectedBrush` | | `ComboBoxItemBackgroundSelectedPointerOver` | `SolidColorBrush` | `PrimarySelectedBrush` | | `ComboBoxItemBackgroundSelectedDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxItemBorderBrush` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxItemBorderBrushPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxItemBorderBrushPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxItemBorderBrushDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxItemBorderBrushSelected` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxItemBorderBrushSelectedUnfocused` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxItemBorderBrushSelectedPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxItemBorderBrushSelectedPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxItemBorderBrushSelectedDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxBorderBrush` | `SolidColorBrush` | `OutlineBrush` | | `ComboBoxBorderBrushPointerOver` | `SolidColorBrush` | `OnSurfaceBrush` | | `ComboBoxBorderBrushPressed` | `SolidColorBrush` | `OnSurfaceBrush` | | `ComboBoxBorderBrushDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `ComboBoxBorderBrushOpened` | `SolidColorBrush` | `PrimaryBrush` | | `ComboBoxDropDownGlyphForeground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxDropDownGlyphForegroundDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxDropDownGlyphForegroundFocused` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxDropDownGlyphForegroundFocusedPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxDropDownForeground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxDropDownBorderBrush` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxDropDownBackground` | `SolidColorBrush` | `SurfaceBrush` | | `ComboBoxDropDownBackgroundPointerOver` | `SolidColorBrush` | `SurfaceBrush` | | `ComboBoxDropDownBackgroundPointerPressed` | `SolidColorBrush` | `SurfaceBrush` | | `ComboBoxDropDownBackgroundPressed` | `SolidColorBrush` | `SurfaceBrush` | | `ComboBoxDropDownBackgroundFocused` | `SolidColorBrush` | `SurfaceBrush` | | `ComboBoxDropDownBackgroundFocusedPressed` | `SolidColorBrush` | `SurfaceBrush` | | `ComboBoxEditableDropDownGlyphForeground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxItemPillFillBrush` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxBackgroundPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxBackgroundPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxBackgroundDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxBackgroundUnfocused` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxBackgroundFocused` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxBackgroundFocusedPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ComboBoxForeground` | `SolidColorBrush` | `OnSurfaceBrush` | | `ComboBoxForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceBrush` | | `ComboBoxForegroundPressed` | `SolidColorBrush` | `OnSurfaceBrush` | | `ComboBoxForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `ComboBoxForegroundFocused` | `SolidColorBrush` | `OnSurfaceBrush` | | `ComboBoxForegroundFocusedPressed` | `SolidColorBrush` | `OnSurfaceBrush` | | `ComboBoxPlaceHolderForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `ComboBoxPlaceHolderForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `ComboBoxPlaceHolderForegroundPressed` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `ComboBoxPlaceHolderForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `ComboBoxPlaceHolderForegroundFocused` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `ComboBoxPlaceHolderForegroundFocusedPressed` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `ComboBoxLeadingIconForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `ComboBoxLeadingIconForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `ComboBoxArrowForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `ComboBoxArrowForegroundOpened` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `ComboBoxUpperPlaceHolderForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `ComboBoxUpperPlaceHolderForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `ComboBoxUpperPlaceHolderForegroundPressed` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `ComboBoxUpperPlaceHolderForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `ComboBoxUpperPlaceHolderForegroundFocused` | `SolidColorBrush` | `PrimaryBrush` | | `ComboBoxUpperPlaceHolderForegroundFocusedPressed` | `SolidColorBrush` | `PrimaryBrush` | | `ComboBoxUpperPlaceHolderForegroundOpened` | `SolidColorBrush` | `PrimaryBrush` | | `ComboBoxCornerRadius` | `CornerRadius` | 4 | | `ComboBoxHeight` | `Double` | 50 | | `ComboBoxMinHeight` | `Double` | 56 | | `ComboBoxLeadingIconWidth` | `Double` | 20 | | `ComboBoxDownGlyphWidth` | `Double` | 10 | | `ComboBoxUpGlyphWidth` | `Double` | 10 | | `ComboBoxDownGlyphHeight` | `Double` | 5 | | `ComboBoxUpGlyphHeight` | `Double` | 5 | | `ComboBoxDownGlyphMargin` | `Thickness` | 7,0 | | `ComboBoxUpGlyphMargin` | `Thickness` | 7,0 | | `ComboBoxLeadingIconMargin` | `Thickness` | 2,0,18,0 | | `ComboBoxBorderThickness` | `Thickness` | 1 | | `ComboBoxOpenedBorderThickness` | `Thickness` | 2 | | `ComboBoxPadding` | `Thickness` | 16,0 | ## Uno.Themes.Styles.DatePicker # DatePicker Control ## Styles | Style Key | IsDefaultStyle\* | |-------------------|------------------| | `DatePickerStyle` | True | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | |--------------------------------------------------------|-------------------|---------------------------------| | `DatePickerFlyoutButtonBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `DatePickerFlyoutPresenterBackground` | `SolidColorBrush` | `SurfaceBrush` | | `DatePickerFlyoutPresenterBorderBrush` | `SolidColorBrush` | `OnSurfaceFocusedBrush` | | `DatePickerFlyoutPresenterSpacerFill` | `SolidColorBrush` | `OnSurfaceFocusedBrush` | | `DatePickerFlyoutPresenterHighlightFill` | `SolidColorBrush` | `PrimarySelectedBrush` | | `DatePickerFlyoutPresenterCornerRadius` | `CornerRadius` | `OverlayCornerRadius` | | `DatePickerButtonBackground` | `SolidColorBrush` | `SurfaceVariantBrush` | | `DatePickerButtonBackgroundPointerOver` | `SolidColorBrush` | `SurfaceVariantBrush` | | `DatePickerButtonBackgroundPressed` | `SolidColorBrush` | `SurfaceVariantBrush` | | `DatePickerButtonBackgroundDisabled` | `SolidColorBrush` | `PrimaryFocusedBrush` | | `DatePickerButtonForeground` | `SolidColorBrush` | `PrimaryBrush` | | `DatePickerButtonForegroundPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `DatePickerButtonForegroundPressed` | `SolidColorBrush` | `PrimaryBrush` | | `DatePickerButtonForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `DatePickerPlaceholderTextForeground` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `DatePickerButtonDateTextForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `DatePickerButtonDateTextForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `DatePickerButtonDateTextForegroundPressed` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `DatePickerButtonDateTextForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `DatePickerButtonBorderBrush` | `SolidColorBrush` | `PrimaryBrush` | | `DatePickerButtonBorderBrushPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `DatePickerButtonBorderBrushPressed` | `SolidColorBrush` | `PrimaryBrush` | | `DatePickerButtonBorderBrushDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `DatePickerFlyoutPresenterFontFamily` | `FontFamily` | `MaterialRegularFontFamily` | | `DatePickerFlyoutPresenterFontSize` | `Double` | `ControlContentThemeFontSize` | | `DatePickerFlyoutBorderThickness` | `Double` | 1 | | `DatePickerSpacerThemeWidth` | `Double` | 1 | | `DatePickerHeight` | `Double` | 53 | | `DatePickerFlyoutElevation` | `Double` | 8 | | `DatePickerFlyoutButtonOpacityPressed` | `Double` | 0.65 | | `DatePickerFlyoutButtonOpacityDisabled` | `Double` | 0.65 | | `DatePickerFlyoutPresenterWidth` | `Double` | 296 | | `DatePickerFlyoutPresenterMinWidth` | `Double` | 296 | | `DatePickerFlyoutPresenterMaxHeight` | `Double` | 398 | | `DatePickerFlyoutPresenterAcceptDismissHostGridHeight` | `Double` | 41 | | `DatePickerFlyoutPresenterHighlightHeight` | `Double` | 40 | | `DatePickerButtonBottomBorderHeight` | `Double` | 2 | | `DatePickerButtonContentHeight` | `Double` | 24 | | `DatePickerButtonHeaderMargin` | `Thickness` | 10,8,10,0 | | `DatePickerButtonPlaceholderMargin` | `Thickness` | 4,0,0,0 | | `DatePickerButtonContentMargin` | `Thickness` | 6,24,10,0 | | `DatePickerHostPadding` | `Thickness` | 24,24,8,8 | | `DatePickerFlyoutButtonPadding` | `Thickness` | 0 | | `DatePickerCornerRadius` | `CornerRadius` | 4,4,0,0 | ## Uno.Themes.Styles.FloatingActionButton # FloatingActionButton Control ## Styles | Style Key | IsDefaultStyle\* | |--------------------------|------------------| | `FabStyle` | True | | `SurfaceFabStyle` | | | `SecondaryFabStyle` | | | `TertiaryFabStyle` | | | `SmallFabStyle` | | | `SurfaceSmallFabStyle` | | | `SecondarySmallFabStyle` | | | `TertiarySmallFabStyle` | | | `LargeFabStyle` | | | `SurfaceLargeFabStyle` | | | `SecondaryLargeFabStyle` | | | `TertiaryLargeFabStyle` | | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | |-------------------------------------------------|-------------------|------------------------------------| | `FabForeground` | `SolidColorBrush` | `OnPrimaryContainerBrush` | | `FabForegroundPressed` | `SolidColorBrush` | `OnPrimaryContainerBrush` | | `FabForegroundPointerOver` | `SolidColorBrush` | `OnPrimaryContainerBrush` | | `FabForegroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `FabBackground` | `SolidColorBrush` | `PrimaryContainerBrush` | | `FabBackgroundPressed` | `SolidColorBrush` | `PrimaryContainerBrush` | | `FabBackgroundPointerOver` | `SolidColorBrush` | `PrimaryContainerBrush` | | `FabBackgroundDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FabStateOverlayBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FabStateOverlayBackgroundPointerOver` | `SolidColorBrush` | `OnPrimaryContainerHoverBrush` | | `FabStateOverlayBackgroundFocused` | `SolidColorBrush` | `OnPrimaryContainerFocusedBrush` | | `FabStateOverlayBackgroundPressed` | `SolidColorBrush` | `OnPrimaryContainerPressedBrush` | | `FabStateOverlayBackgroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `FabSurfaceForeground` | `SolidColorBrush` | `OnPrimaryContainerBrush` | | `FabSurfaceForegroundPressed` | `SolidColorBrush` | `OnPrimaryContainerBrush` | | `FabSurfaceForegroundPointerOver` | `SolidColorBrush` | `OnPrimaryContainerBrush` | | `FabSurfaceForegroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `FabSurfaceBackground` | `SolidColorBrush` | `SurfaceBrush` | | `FabSurfaceBackgroundPressed` | `SolidColorBrush` | `SurfaceBrush` | | `FabSurfaceBackgroundPointerOver` | `SolidColorBrush` | `SurfaceBrush` | | `FabSurfaceBackgroundDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FabSurfaceStateOverlayBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FabSurfaceStateOverlayBackgroundPointerOver` | `SolidColorBrush` | `PrimaryHoverBrush` | | `FabSurfaceStateOverlayBackgroundFocused` | `SolidColorBrush` | `PrimaryFocusedBrush` | | `FabSurfaceStateOverlayBackgroundPressed` | `SolidColorBrush` | `PrimaryPressedBrush` | | `FabSurfaceStateOverlayBackgroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `FabSecondaryForeground` | `SolidColorBrush` | `OnSecondaryContainerBrush` | | `FabSecondaryForegroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `FabSecondaryForegroundPointerOver` | `SolidColorBrush` | `OnSecondaryContainerBrush` | | `FabSecondaryForegroundPressed` | `SolidColorBrush` | `OnSecondaryContainerBrush` | | `FabSecondaryBackground` | `SolidColorBrush` | `SecondaryContainerBrush` | | `FabSecondaryBackgroundPointerOver` | `SolidColorBrush` | `SecondaryContainerBrush` | | `FabSecondaryBackgroundPressed` | `SolidColorBrush` | `SecondaryContainerBrush` | | `FabSecondaryBackgroundDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FabSecondaryStateOverlayBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FabSecondaryStateOverlayBackgroundPointerOver` | `SolidColorBrush` | `OnSecondaryContainerHoverBrush` | | `FabSecondaryStateOverlayBackgroundFocused` | `SolidColorBrush` | `OnSecondaryContainerFocusedBrush` | | `FabSecondaryStateOverlayBackgroundPressed` | `SolidColorBrush` | `OnSecondaryContainerPressedBrush` | | `FabSecondaryStateOverlayBackgroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `FabTertiaryForeground` | `SolidColorBrush` | `OnTertiaryContainerBrush` | | `FabTertiaryForegroundPointerOver` | `SolidColorBrush` | `OnTertiaryContainerBrush` | | `FabTertiaryForegroundPressed` | `SolidColorBrush` | `OnTertiaryContainerBrush` | | `FabTertiaryForegroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `FabTertiaryBackground` | `SolidColorBrush` | `TertiaryContainerBrush` | | `FabTertiaryBackgroundPointerOver` | `SolidColorBrush` | `TertiaryContainerBrush` | | `FabTertiaryBackgroundPressed` | `SolidColorBrush` | `TertiaryContainerBrush` | | `FabTertiaryBackgroundDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FabTertiaryStateOverlayBackgroundPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FabTertiaryStateOverlayBackgroundFocused` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FabTertiaryStateOverlayBackgroundPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `FabTertiaryStateOverlayBackgroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | ## Uno.Themes.Styles.HyperlinkButton # HyperlinkButton Control ## Styles | Style Key | IsDefaultStyle\* | |---------------------------------|------------------| | `HyperlinkButtonStyle` | True | | `SecondaryHyperlinkButtonStyle` | | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | |-----------------------------------------------|-------------------|---------------------------------| | `HyperlinkButtonForeground` | `SolidColorBrush` | `PrimaryBrush` | | `HyperlinkButtonForegroundPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `HyperlinkButtonForegroundPressed` | `SolidColorBrush` | `PrimaryBrush` | | `HyperlinkButtonForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `HyperlinkButtonBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `HyperlinkButtonBackgroundPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `HyperlinkButtonBackgroundPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `HyperlinkButtonBackgroundDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `HyperlinkButtonBorderBrush` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `HyperlinkButtonBorderBrushPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `HyperlinkButtonBorderBrushPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `HyperlinkButtonBorderBrushDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `HyperlinkButtonFontSize` | `Double` | `LabelLargeFontSize` | | `HyperlinkButtonFontFamily` | `FontFamily` | `MaterialRegularFontFamily` | | `HyperlinkButtonBackgroundOpacity` | `Double` | 1 | | `HyperlinkButtonBackgroundOpacityPointerOver` | `Double` | `MediumOpacity` | | `HyperlinkButtonBackgroundOpacityPressed` | `Double` | `LowOpacity` | | `HyperlinkButtonBackgroundOpacityDisabled` | `Double` | 1 | | `HyperlinkButtonPadding` | `Thickness` | 0 | ## Uno.Themes.Styles.NavigationView # NavigationView Control ## Styles | Style Key | IsDefaultStyle\* | |---------------------------|------------------| | `NavigationViewStyle` | True | | `NavigationViewItemStyle` | True | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | |---------------------------------------------------------------|-------------------|---------------------------------------------------| | `MaterialNavigationViewSplitViewCornerRadius` | `CornerRadius` | 0 | | `MaterialNavigationViewContentGridCornerRadius` | `CornerRadius` | 0 | | `MaterialNavigationViewSplitViewPadding` | `Thickness` | 0,12 | | `MaterialNavigationViewButtonWidth` | `Double` | 56 | | `MaterialNavigationViewButtonHeight` | `Double` | 32 | | `MaterialNavigationViewButtonCornerRadius` | `CornerRadius` | 16 | | `MaterialNavigationViewButtonIconLength` | `Double` | 24 | | `MaterialNavigationViewButtonIconSymbolFontSize` | `Double` | 24 | | `MaterialNavigationViewButtonMarginWhenStackedVertically` | `Thickness` | 12,0 | | `MaterialNavigationItemHeight` | `Double` | 56 | | `MaterialNavigationItemHeightCompact` | `Double` | 32 | | `MaterialNavigationItemMarginCompact` | `Double` | 12 | | `MaterialNavigationViewItemCornerRadius` | `CornerRadius` | 28 | | `MaterialNavigationViewItemCornerRadiusLeftOnly` | `CornerRadius` | 28,0,0,28 | | `MaterialNavigationViewItemCornerRadiusCompact` | `CornerRadius` | 16 | | `MaterialNavigationItemLeftMargin` | `Thickness` | 12,0 | | `MaterialNavigationItemIconLength` | `Double` | 24 | | `MaterialNavigationItemContentMargin` | `Thickness` | 12,0,0,0 | | `MaterialNavigationItemContentMarginWithoutIcon` | `Thickness` | 0 | | `MaterialNavigationItemContentPaddingCompact` | `Thickness` | 16,4 | | `NavigationViewAutoSuggestBoxMargin` | `Thickness` | 16,0 | | `TopNavigationViewAutoSuggestBoxMargin` | `Thickness` | 4,0 | | `PaneToggleButtonHeight` | `Double` | 32 | | `PaneToggleButtonWidth` | `Double` | 80 | | `NavigationViewCompactPaneLength` | `Double` | 80 | | `NavigationViewIconBoxWidth` | `Double` | 40 | | `NavigationViewTopPaneHeight` | `Double` | 48 | | `NavigationViewAutoSuggestAreaHeight` | `Double` | 40 | | `TopNavigationViewPaneCustomContentMinWidth` | `Double` | 80 | | `TopNavigationViewOverflowButtonWidth` | `Double` | 40 | | `TopNavigationViewOverflowButtonHeight` | `Double` | 40 | | `TopNavigationViewSettingsButtonWidth` | `Double` | 40 | | `TopNavigationViewSettingsButtonHeight` | `Double` | 40 | | `NavigationViewItemOnLeftMinHeight` | `Double` | 56 | | `NavigationViewPaneHeaderRowMinHeight` | `Double` | 56 | | `NavigationViewItemOnLeftIconBoxHeight` | `Double` | 24 | | `NavigationViewSelectionIndicatorWidth` | `Double` | 3 | | `NavigationViewSelectionIndicatorHeight` | `Double` | 24 | | `NavigationViewSelectionIndicatorRadius` | `Double` | 2 | | `NavigationViewItemSeparatorHeight` | `Double` | 1 | | `TopNavigationViewItemSeparatorWidth` | `Double` | 1 | | `NavigationViewToggleBorderThickness` | `Thickness` | 0 | | `NavigationViewItemBorderThickness` | `Thickness` | 1 | | `NavigationViewItemOnLeftIconBoxMargin` | `Thickness` | 3 | | `NavigationViewItemButtonMargin` | `Thickness` | 12,0 | | `NavigationViewItemInnerHeaderMargin` | `Thickness` | 16,0 | | `TopNavigationViewItemInnerHeaderMargin` | `Thickness` | 12,0 | | `NavigationViewMinimalHeaderMargin` | `Thickness` | -24,44,0,0 | | `NavigationViewButtonHolderGridMargin` | `Thickness` | 0 | | `NavigationViewPaneContentGridMargin` | `Thickness` | -1,3 | | `NavigationViewContentGridBorderThickness` | `Thickness` | 1,1,0,0 | | `NavigationViewMinimalContentGridBorderThickness` | `Thickness` | 0,1,0,0 | | `TopNavigationViewContentGridBorderThickness` | `Thickness` | 0,1,0,0 | | `TopNavigationViewTopNavGridMargin` | `Thickness` | 4,0 | | `NavigationViewBorderThickness` | `Thickness` | 1 | | `NavigationViewHeaderMargin` | `Thickness` | 56,44,0,0 | | `NavigationViewContentPresenterMargin` | `Thickness` | 0 | | `NavigationViewContentMargin` | `Thickness` | 0 | | `NavigationViewMinimalContentMargin` | `Thickness` | 0 | | `TopNavigationViewContentMargin` | `Thickness` | 0 | | `NavigationViewPaneTitlePresenterMargin` | `Thickness` | 8,4,0,0 | | `NavigationViewItemMargin` | `Thickness` | 0 | | `TopNavigationViewItemMargin` | `Thickness` | 0 | | `NavigationViewItemSeparatorMargin` | `Thickness` | 28,0 | | `NavigationViewCompactItemSeparatorMargin` | `Thickness` | 0,3,0,4 | | `TopNavigationViewItemSeparatorMargin` | `Thickness` | 3,0,4,0 | | `TopNavigationViewOverflowButtonMargin` | `Thickness` | 0 | | `NavigationViewItemContentPresenterMargin` | `Thickness` | 4,-1,8,-1 | | `NavigationViewCompactItemContentPresenterMargin` | `Thickness` | 0 | | `TopNavigationViewItemContentPresenterMargin` | `Thickness` | 8,-1,12,-1 | | `TopNavigationViewItemContentOnlyContentPresenterMargin` | `Thickness` | 12,0 | | `NavigationViewItemExpandChevronMargin` | `Thickness` | 0,0,-14,0 | | `TopNavigationViewItemExpandChevronMargin` | `Thickness` | -16,0,0,0 | | `TopNavigationViewItemIconOnlyExpandChevronMargin` | `Thickness` | 0 | | `TopNavigationViewItemContentOnlyExpandChevronMargin` | `Thickness` | -12,0,0,0 | | `TopNavigationViewItemOnOverflowContentPresenterMargin` | `Thickness` | 12,0,20,0 | | `TopNavigationViewItemOnOverflowNoIconContentPresenterMargin` | `Thickness` | 16,0,20,0 | | `TopNavigationViewItemOnOverflowExpandChevronMargin` | `Thickness` | -4,0,-8,0 | | `TopNavigationViewItemOnOverflowExpandChevronPadding` | `Thickness` | 12,0 | | `NavigationViewContentGridCornerRadius` | `CornerRadius` | 8,0,0,0 | | `TopNavigationViewContentGridCornerRadius` | `CornerRadius` | 0 | | `NavigationViewMinimalContentGridCornerRadius` | `CornerRadius` | 0 | | `TopNavigationViewOverflowMenuPadding` | `Thickness` | 0,8 | | `NavigationViewItemChildrenMenuFlyoutPadding` | `Thickness` | 0,8 | | `NavigationViewItemExpandedGlyphFontSize` | `Double` | 8 | | `NavigationViewItemExpandedGlyph` | `String` |  | | `SplitViewOpenPaneThemeLength` | `Double` | 320 | | `SplitViewCompactPaneThemeLength` | `Double` | 48 | | `SplitViewLeftBorderThemeThickness` | `Thickness` | 0,0,1,0 | | `SplitViewRightBorderThemeThickness` | `Thickness` | 1,0,0,0 | | `NavigationViewSplitViewLightDismissOverlayBackground` | `SolidColorBrush` | `SystemControlPageBackgroundMediumAltMediumBrush` | | `SplitViewPaneAnimationOpenDuration` | `String` | 00:00:00.2 | | `SplitViewPaneAnimationOpenPreDuration` | `String` | 00:00:00.19999 | | `SplitViewPaneAnimationCloseDuration` | `String` | 00:00:00.1 | | `SplitViewPaneRootCornerRadius` | `CornerRadius` | 0 | | `NavigationViewBackground` | `SolidColorBrush` | `SurfaceBrush` | | `NavigationViewDefaultPaneBackground` | `SolidColorBrush` | `SurfaceVariantBrush` | | `NavigationViewPaneBackground` | `SolidColorBrush` | `SurfaceVariantBrush` | | `NavigationViewTopPaneBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewDefaultPaneBorderBrush` | `SolidColorBrush` | `SurfaceBrush` | | `NavigationViewButtonForeground` | `SolidColorBrush` | `OnSurfaceBrush` | | `NavigationViewButtonForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceBrush` | | `NavigationViewButtonForegroundPressed` | `SolidColorBrush` | `OnSurfaceBrush` | | `NavigationViewButtonForegroundDisabled` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `NavigationViewButtonBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewButtonBackgroundPointerOver` | `SolidColorBrush` | `OnSurfaceHoverBrush` | | `NavigationViewButtonBackgroundPressed` | `SolidColorBrush` | `OnSurfacePressedBrush` | | `NavigationViewButtonBackgroundDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewButtonRippleFeedback` | `SolidColorBrush` | `PrimaryPressedBrush` | | `NavigationViewItemBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewItemBackgroundPointerOver` | `SolidColorBrush` | `OnSurfaceHoverBrush` | | `NavigationViewItemBackgroundPressed` | `SolidColorBrush` | `OnSurfacePressedBrush` | | `NavigationViewItemBackgroundDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewItemBackgroundSelected` | `SolidColorBrush` | `SecondaryContainerBrush` | | `NavigationViewItemBackgroundSelectedPointerOver` | `SolidColorBrush` | `OnSurfaceHoverBrush` | | `NavigationViewItemBackgroundSelectedPressed` | `SolidColorBrush` | `OnSurfacePressedBrush` | | `NavigationViewItemBackgroundSelectedDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `NavigationViewItemForeground` | `SolidColorBrush` | `OnSurfaceBrush` | | `NavigationViewItemForegroundPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewItemForegroundPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewItemForegroundDisabled` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `NavigationViewItemForegroundSelected` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewItemForegroundSelectedPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewItemForegroundSelectedPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewItemForegroundSelectedDisabled` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `NavigationViewItemBorderBrush` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewItemBorderBrushPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewItemBorderBrushPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewItemBorderBrushDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewItemBorderBrushSelected` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewItemBorderBrushSelectedPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewItemBorderBrushSelectedPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewItemBorderBrushSelectedDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewItemSeparatorForeground` | `SolidColorBrush` | `OnSurfacePressedBrush` | | `NavigationViewItemHeaderForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `NavigationViewSelectionIndicatorForeground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `NavigationViewItemRippleFeedback` | `SolidColorBrush` | `PrimaryPressedBrush` | | `TopNavigationViewItemForeground` | `SolidColorBrush` | `OnSurfaceBrush` | | `TopNavigationViewItemForegroundPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TopNavigationViewItemForegroundPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TopNavigationViewItemForegroundDisabled` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `TopNavigationViewItemForegroundSelected` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TopNavigationViewItemForegroundSelectedPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TopNavigationViewItemForegroundSelectedPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TopNavigationViewItemBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TopNavigationViewItemBackgroundPointerOver` | `SolidColorBrush` | `PrimaryHoverBrush` | | `TopNavigationViewItemBackgroundPressed` | `SolidColorBrush` | `PrimaryPressedBrush` | | `TopNavigationViewItemBackgroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `TopNavigationViewItemBackgroundSelected` | `SolidColorBrush` | `PrimarySelectedBrush` | | `TopNavigationViewItemBackgroundSelectedPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TopNavigationViewItemBackgroundSelectedPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TopNavigationViewItemSeparatorForeground` | `SolidColorBrush` | `SystemControlTransparentBrush` | ## Uno.Themes.Styles.PasswordBox # PasswordBox Control ## Styles | Style Key | IsDefaultStyle\* | |----------------------------|------------------| | `FilledPasswordBoxStyle` | | | `OutlinedPasswordBoxStyle` | True | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | |-------------------------------------------------------|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `PasswordBoxRevealGlyphPathData` | `String` | `M11 0.5C6 0.5 1.73 3.61 0 8C1.73 12.39 6 15.5 11 15.5C16 15.5 20.27 12.39 22 8C20.27 3.61 16 0.5 11 0.5ZM11 13C8.24 13 6 10.76 6 8C6 5.24 8.24 3 11 3C13.76 3 16 5.24 16 8C16 10.76 13.76 13 11 13ZM11 5C9.34 5 8 6.34 8 8C8 9.66 9.34 11 11 11C12.66 11 14 9.66 14 8C14 6.34 12.66 5 11 5Z` | | `PasswordBoxRevealButtonForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `PasswordBoxLeadingIconForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `PasswordBoxLeadingIconForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `FilledPasswordBoxBackground` | `SolidColorBrush` | `SurfaceVariantBrush` | | `FilledPasswordBoxBackgroundPointerOver` | `SolidColorBrush` | `OnSurfaceVariantHoverBrush` | | `FilledPasswordBoxBackgroundFocused` | `SolidColorBrush` | `SurfaceVariantBrush` | | `FilledPasswordBoxBackgroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `FilledPasswordBoxBorderBrush` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `FilledPasswordBoxBorderBrushPointerOver` | `SolidColorBrush` | `OnSurfaceBrush` | | `FilledPasswordBoxBorderBrushFocused` | `SolidColorBrush` | `PrimaryBrush` | | `FilledPasswordBoxBorderBrushDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `FilledPasswordBoxForeground` | `SolidColorBrush` | `OnSurfaceBrush` | | `FilledPasswordBoxForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceBrush` | | `FilledPasswordBoxForegroundFocused` | `SolidColorBrush` | `OnSurfaceBrush` | | `FilledPasswordBoxForegroundDisabled` | `SolidColorBrush` | `OnSurfaceBrush` | | `FilledPasswordBoxForegroundOpacityDisabled` | `Double` | `LowOpacity` | | `FilledPasswordBoxPlaceholderForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `FilledPasswordBoxPlaceholderForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `FilledPasswordBoxPlaceholderForegroundFocused` | `SolidColorBrush` | `PrimaryBrush` | | `FilledPasswordBoxPlaceholderForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `FilledPasswordBoxRevealButtonForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `FilledPasswordBoxFontFamily` | `FontFamily` | `BodyLargeFontFamily` | | `FilledPasswordBoxFontWeight` | `String` | `BodyLargeFontWeight` | | `FilledPasswordBoxFontSize` | `Double` | `BodyLargeFontSize` | | `FilledPasswordBoxCharacterSpacing` | `Int32` | `BodyLargeCharacterSpacing` | | `FilledPasswordBoxCornerRadius` | `CornerRadius` | 4,4,0,0 | | `FilledPasswordBoxMinHeight` | `Double` | 56 | | `FilledPasswordBoxBorderHeightPointerOver` | `Double` | 2 | | `FilledPasswordBoxBorderHeightFocused` | `Double` | 2 | | `FilledPasswordBoxPadding` | `Thickness` | 16,4,8,4 | | `OutlinedPasswordBoxBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `OutlinedPasswordBoxBackgroundPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `OutlinedPasswordBoxBackgroundFocused` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `OutlinedPasswordBoxBackgroundDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `OutlinedPasswordBoxBorderBrush` | `SolidColorBrush` | `OutlineBrush` | | `OutlinedPasswordBoxBorderBrushPointerOver` | `SolidColorBrush` | `OnSurfaceBrush` | | `OutlinedPasswordBoxBorderBrushFocused` | `SolidColorBrush` | `PrimaryBrush` | | `OutlinedPasswordBoxBorderBrushDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `OutlinedPasswordBoxForeground` | `SolidColorBrush` | `OnSurfaceBrush` | | `OutlinedPasswordBoxForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceBrush` | | `OutlinedPasswordBoxForegroundFocused` | `SolidColorBrush` | `OnSurfaceBrush` | | `OutlinedPasswordBoxForegroundDisabled` | `SolidColorBrush` | `OnSurfaceBrush` | | `OutlinedPasswordBoxForegroundOpacityDisabled` | `Double` | `LowOpacity` | | `OutlinedPasswordBoxPlaceholderForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `OutlinedPasswordBoxPlaceholderForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceBrush` | | `OutlinedPasswordBoxPlaceholderForegroundFocused` | `SolidColorBrush` | `PrimaryBrush` | | `OutlinedPasswordBoxPlaceholderForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `OutlinedPasswordBoxFontFamily` | `FontFamily` | `BodyLargeFontFamily` | | `OutlinedPasswordBoxFontWeight` | `String` | `BodyLargeFontWeight` | | `OutlinedPasswordBoxFontSize` | `Double` | `BodyLargeFontSize` | | `OutlinedPasswordBoxCharacterSpacing` | `Int32` | `BodyLargeCharacterSpacing` | | `OutlinedPasswordBoxCornerRadius` | `CornerRadius` | 4 | | `OutlinedPasswordBoxMinHeight` | `Double` | 58 | | `OutlinedPasswordBoxPadding` | `Thickness` | 16,4,8,4 | | `OutlinedPasswordBoxBorderThickness` | `Thickness` | 1 | | `OutlinedPasswordBoxBorderThicknessPointerOver` | `Thickness` | 1 | | `OutlinedPasswordBoxBorderThicknessFocused` | `Thickness` | 2 | ## Uno.Themes.Styles.PipsPager # PipsPager Control ## Styles | Style Key | IsDefaultStyle\* | |------------------|------------------| | `PipsPagerStyle` | True | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | |----------------------------------------------------------------------|-------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `PipsPagerSelectionIndicatorBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerSelectionIndicatorBackgroundPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerSelectionIndicatorBackgroundPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerSelectionIndicatorBackgroundSelected` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerSelectionIndicatorBackgroundDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerSelectionIndicatorBorderBrush` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerSelectionIndicatorBorderBrushPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerSelectionIndicatorBorderBrushPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerSelectionIndicatorBorderBrushSelected` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerSelectionIndicatorBorderBrushDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerSelectionIndicatorForeground` | `SolidColorBrush` | `SurfaceVariantBrush` | | `PipsPagerSelectionIndicatorForegroundPointerOver` | `SolidColorBrush` | `SurfaceBrush` | | `PipsPagerSelectionIndicatorForegroundPressed` | `SolidColorBrush` | `SurfaceBrush` | | `PipsPagerSelectionIndicatorForegroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `PipsPagerSelectionIndicatorForegroundFocused` | `SolidColorBrush` | `SurfaceBrush` | | `PipsPagerSelectionIndicatorForegroundSelected` | `SolidColorBrush` | `PrimaryBrush` | | `MaterialPipsPagerVisualStateEllipseFill` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `MaterialPipsPagerVisualStateEllipseFillPointerOver` | `SolidColorBrush` | `PrimaryHoverBrush` | | `MaterialPipsPagerVisualStateEllipseFillPressed` | `SolidColorBrush` | `PrimaryPressedBrush` | | `MaterialPipsPagerVisualStateEllipseFillFocused` | `SolidColorBrush` | `PrimaryFocusedBrush` | | `PipsPagerNavigationButtonBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerNavigationButtonBackgroundPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerNavigationButtonBackgroundPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerNavigationButtonBackgroundDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerNavigationButtonBorderBrush` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerNavigationButtonBorderBrushPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerNavigationButtonBorderBrushPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerNavigationButtonBorderBrushDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `PipsPagerNavigationButtonForeground` | `SolidColorBrush` | `PrimaryBrush` | | `PipsPagerNavigationButtonForegroundPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `PipsPagerNavigationButtonForegroundPressed` | `SolidColorBrush` | `PrimaryBrush` | | `PipsPagerNavigationButtonForegroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `MaterialPipsPagerNavigationButtonVisualStateEllipseFill` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `MaterialPipsPagerNavigationButtonVisualStateEllipseFillPointerOver` | `SolidColorBrush` | `PrimaryHoverBrush` | | `MaterialPipsPagerNavigationButtonVisualStateEllipseFillPressed` | `SolidColorBrush` | `PrimaryPressedBrush` | | `MaterialPipsPagerNavigationButtonVisualStateEllipseFillFocused` | `SolidColorBrush` | `PrimaryFocusedBrush` | | `MaterialPipsPagerNavigationButtonVisualStateEllipseFillUnfocused` | `Brush` | `SystemControlTransparentBrush` | | `PipsPagerHorizontalOrientationButtonWidth` | `Double` | 12 | | `PipsPagerHorizontalOrientationButtonHeight` | `Double` | 12 | | `PipsPagerVerticalOrientationButtonWidth` | `Double` | 12 | | `PipsPagerVerticalOrientationButtonHeight` | `Double` | 12 | | `PipsPagerButtonBorderThickness` | `Thickness` | 0 | | `PipsPagerNavigationButtonBorderThickness` | `Thickness` | 0 | | `PipsPagerPreviousPageButtonData` | `String` | `M3.33681 0.322148C3.63156 -0.107383 4.36844 -0.107382 4.66319 0.322148L7.89626 5.03356C8.19101 5.46309 7.82257 6 7.23307 6L0.766932 6C0.177427 6 -0.191014 5.46309 0.103739 5.03356L3.33681 0.322148Z` | | `PipsPagerNextPageButtonData` | `String` | `M4.66319 5.67785C4.36844 6.10738 3.63156 6.10738 3.33681 5.67785L0.103738 0.966444C-0.191015 0.536913 0.177425 6.83871e-07 0.766931 6.32335e-07L7.23307 6.70473e-08C7.82257 1.55111e-08 8.19101 0.536912 7.89626 0.966443L4.66319 5.67785Z` | | `PipsPagerNavigationButtonHeight` | `Double` | 40 | | `PipsPagerNavigationButtonWidth` | `Double` | 40 | | `PipsPagerNavigationButtonPadding` | `Thickness` | 4 | | `PipsPagerNavigationVisualStatesEllipseWidth` | `Double` | 12 | | `PipsPagerNavigationVisualStatesEllipseHeight` | `Double` | 12 | | `PipsPagerSelectedEllipseSize` | `Double` | 8 | | `PipsPagerNormalEllipseSize` | `Double` | 8 | ## Uno.Themes.Styles.ProgressBar # ProgressBar Control ## Styles | Style Key | IsDefaultStyle\* | |--------------------|------------------| | `ProgressBarStyle` | True | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | |-------------------------|-------------------|-----------------------| | `ProgressBarForeground` | `SolidColorBrush` | `PrimaryBrush` | | `ProgressBarBackground` | `SolidColorBrush` | `SurfaceVariantBrush` | | `ProgressBarMinWidth` | `Double` | 250 | | `ProgressBarHeight` | `Double` | 4 | ## Uno.Themes.Styles.ProgressRing # ProgressRing Control ## Styles | Style Key | IsDefaultStyle\* | |---------------------|------------------| | `ProgressRingStyle` | True | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | |--------------------------|-------------------|---------------------------------| | `ProgressRingForeground` | `SolidColorBrush` | `PrimaryBrush` | | `ProgressRingBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | ## Uno.Themes.Styles.RadioButton # RadioButton Control ## Styles | Style Key | IsDefaultStyle\* | |--------------------|------------------| | `RadioButtonStyle` | True | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | |---------------------------------------------------|-------------------|---------------------------------| | `RadioButtonForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `RadioButtonForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `RadioButtonForegroundPressed` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `RadioButtonForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `RadioButtonOuterEllipseStroke` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `RadioButtonOuterEllipseStrokePointerOver` | `SolidColorBrush` | `OnSurfaceBrush` | | `RadioButtonOuterEllipseStrokePressed` | `SolidColorBrush` | `OnSurfaceBrush` | | `RadioButtonOuterEllipseStrokeDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `RadioButtonOuterEllipseCheckedStroke` | `SolidColorBrush` | `PrimaryBrush` | | `RadioButtonOuterEllipseCheckedStrokePointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `RadioButtonOuterEllipseCheckedStrokePressed` | `SolidColorBrush` | `PrimaryBrush` | | `RadioButtonOuterEllipseCheckedStrokeDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `RadioButtonOuterEllipseFill` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `RadioButtonOuterEllipseFillPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `RadioButtonOuterEllipseFillPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `RadioButtonOuterEllipseFillDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `RadioButtonOuterEllipseCheckedFill` | `SolidColorBrush` | `PrimaryBrush` | | `RadioButtonOuterEllipseCheckedFillPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `RadioButtonOuterEllipseCheckedFillPressed` | `SolidColorBrush` | `PrimaryBrush` | | `RadioButtonOuterEllipseCheckedFillDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `RadioButtonStateCircleBackgroundUnchecked` | `SolidColorBrush` | `OnSurfaceBrush` | | `RadioButtonStateCircleBackgroundChecked` | `SolidColorBrush` | `PrimaryBrush` | | `RadioButtonStateCircleOpacityPointerOver` | `Double` | `HoverOpacity` | | `RadioButtonStateCircleOpacityPressed` | `Double` | `PressedOpacity` | | `RadioButtonStateCircleOpacityFocused` | `Double` | `FocusedOpacity` | | `RadioButtonFontFamily` | `FontFamily` | `BodySmallFontFamily` | | `RadioButtonFontWeight` | `String` | `BodySmallFontWeight` | | `RadioButtonFontSize` | `Double` | `BodySmallFontSize` | | `RadioButtonCharacterSpacing` | `Int32` | `BodySmallCharacterSpacing` | | `RadioButtonGridLength` | `GridLength` | 40 | | `RadioButtonWidth` | `Double` | 40 | | `RadioButtonHeight` | `Double` | 40 | | `RadioButtonCheckGlyphSize` | `Double` | 20 | | `RadioButtonMinHeight` | `Double` | 40 | | `RadioButtonMinWidth` | `Double` | 40 | | `RadioButtonStrokeThickness` | `Double` | 2 | | `RadioButtonPadding` | `Thickness` | 4,0,0,0 | | `RadioButtonCheckEllipsePadding` | `Thickness` | 5 | ## Uno.Themes.Styles.RatingControl # RatingControl Control ## Styles | Style Key | IsDefaultStyle\* | |-------------------------------|------------------| | `RatingControlStyle` | True | | `SecondaryRatingControlStyle` | | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | |----------------------------------------------------------|---------------------|-----------------------------| | `RatingControlHeight` | `Double` | 32 | | `RatingControlCaptionHeight` | `Double` | 32 | | `SecondaryRatingControlCaptionHeight` | `Double` | 32 | | `RatingControlForeground` | `SolidColorBrush` | `PrimaryBrush` | | `RatingControlUnselectedForeground` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `RatingControlSelectedForeground` | `SolidColorBrush` | `PrimaryBrush` | | `RatingControlPlaceholderForeground` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `RatingControlPlaceholderForegroundPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `RatingControlUnselectedForegroundPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `RatingControlSelectedForegroundPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `RatingControlSelectedForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `SecondaryRatingControlForeground` | `SolidColorBrush` | `SecondaryBrush` | | `SecondaryRatingControlUnselectedForeground` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `SecondaryRatingControlSelectedForeground` | `SolidColorBrush` | `SecondaryBrush` | | `SecondaryRatingControlPlaceholderForeground` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `SecondaryRatingControlPlaceholderForegroundPointerOver` | `SolidColorBrush` | `SecondaryBrush` | | `SecondaryRatingControlUnselectedForegroundPointerOver` | `SolidColorBrush` | `SecondaryBrush` | | `SecondaryRatingControlSelectedForegroundPointerOver` | `SolidColorBrush` | `SecondaryBrush` | | `SecondaryRatingControlSelectedForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `RatingControlCaptionForeground` | `SolidColorBrush` | `OnSurfaceBrush` | | `RatingControlCaptionFontFamily` | `FontFamily` | `MaterialRegularFontFamily` | | `RatingControlCaptionStyle` | `StaticResourceRef` | `CaptionMedium` | | `RatingControlFontFamily` | `FontFamily` | `SymbolThemeFontFamily` | | `SecondaryRatingControlCaptionForeground` | `SolidColorBrush` | `OnSurfaceBrush` | | `SecondaryRatingControlCaptionFontFamily` | `FontFamily` | `MaterialRegularFontFamily` | | `SecondaryRatingControlCaptionStyle` | `StaticResourceRef` | `CaptionMedium` | ## Uno.Themes.Styles.Slider # Slider Control ## Styles | Style Key | IsDefaultStyle\* | |---------------|------------------| | `SliderStyle` | True | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | |---------------------------------------|-------------------|------------------------------------------------| | `MaterialSliderThumbDisabledColor` | `Color` | #685C64 | | `MaterialSliderThumbDisabledBrush` | `SolidColorBrush` | `Color` = `MaterialSliderThumbDisabledColor` | | `SliderFocusVisualMargin` | `Thickness` | -7,0 | | `SliderFontFamily` | `FontFamily` | `MaterialRegularFontFamily` | | `SliderFontSize` | `Double` | `LabelMediumFontSize` | | `SliderTrackFill` | `SolidColorBrush` | `SurfaceVariantBrush` | | `SliderTrackFillDisabled` | `SolidColorBrush` | `OnSurfaceSelectedBrush` | | `SliderTrackValueFill` | `SolidColorBrush` | `PrimaryBrush` | | `SliderTrackValueFillDisabled` | `SolidColorBrush` | `SystemControlDisabledChromeDisabledHighBrush` | | `SliderHorizontalFillCornerRadius` | `CornerRadius` | 4,0,0,4 | | `SliderVerticalFillCornerRadius` | `CornerRadius` | 0,0,4,4 | | `SliderTrackThickness` | `Double` | 4 | | `SliderFillThickness` | `Double` | 6 | | `SliderTickBarFill` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `SliderTickBarFillDisabled` | `SolidColorBrush` | `SystemControlDisabledChromeDisabledHighBrush` | | `SliderInlineTickBarFill` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `SliderTopTickBarHeight` | `Double` | 4 | | `SliderBottomTickBarHeight` | `Double` | 4 | | `SliderHorizontalInlineTickBarHeight` | `Double` | 2 | | `SliderLeftTickBarWidth` | `Double` | 4 | | `SliderRightTickBarWidth` | `Double` | 4 | | `SliderVerticalInlineTickBarWidth` | `Double` | 2 | | `SliderTopTickBarMargin` | `Thickness` | 0,0,0,4 | | `SliderBottomTickBarMargin` | `Thickness` | 0,4,0,0 | | `SliderLeftTickBarMargin` | `Thickness` | 0,0,4,0 | | `SliderRightTickBarMargin` | `Thickness` | 4,0,0,0 | | `SliderThumbBackground` | `SolidColorBrush` | `PrimaryBrush` | | `SliderThumbBackgroundDisabled` | `SolidColorBrush` | `MaterialSliderThumbDisabledBrush` | | `SliderThumbWidth` | `Double` | 20 | | `SliderThumbHeight` | `Double` | 20 | | `SliderThumbCornerRadius` | `Double` | 10 | | `SliderTrackCornerRadius` | `CornerRadius` | `ControlCornerRadius` | | `SliderHorizontalFocusVisualMargin` | `Thickness` | -14,-6 | | `SliderVerticalFocusVisualMargin` | `Thickness` | -6,-14 | ## Uno.Themes.Styles.TextBlock # TextBlock Control ## Styles | Style Key | IsDefaultStyle\* | |-------------------|------------------| | `DisplayLarge` | | | `DisplayMedium` | | | `DisplaySmall` | | | `HeadlineLarge` | | | `HeadlineMedium` | | | `HeadlineSmall` | | | `TitleLarge` | | | `TitleMedium` | | | `TitleSmall` | | | `LabelLarge` | | | `LabelMedium` | | | `LabelSmall` | | | `LabelExtraSmall` | | | `BodyLarge` | | | `BodyMedium` | True | | `BodySmall` | | | `CaptionLarge` | | | `CaptionMedium` | | | `CaptionSmall` | | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling `(Typography)` | Key | Type | Value | |-----------------------------------|----------|-----------------------------| | `DisplayLargeFontFamily` | `String` | `MaterialRegularFontFamily` | | `DisplayLargeFontWeight` | `String` | `Normal` | | `DisplayLargeFontSize` | `Double` | 57 | | `DisplayLargeCharacterSpacing` | `Int32` | -17 | | `DisplayMediumFontFamily` | `String` | `MaterialRegularFontFamily` | | `DisplayMediumFontWeight` | `String` | `Normal` | | `DisplayMediumFontSize` | `Double` | 45 | | `DisplaySmallFontFamily` | `String` | `MaterialRegularFontFamily` | | `DisplaySmallFontWeight` | `String` | `Normal` | | `DisplaySmallFontSize` | `Double` | 36 | | `HeadlineLargeFontFamily` | `String` | `MaterialRegularFontFamily` | | `HeadlineLargeFontWeight` | `String` | `Normal` | | `HeadlineLargeFontSize` | `Double` | 32 | | `HeadlineMediumFontFamily` | `String` | `MaterialRegularFontFamily` | | `HeadlineMediumFontWeight` | `String` | `Normal` | | `HeadlineMediumFontSize` | `Double` | 28 | | `HeadlineSmallFontFamily` | `String` | `MaterialRegularFontFamily` | | `HeadlineSmallFontWeight` | `String` | `Normal` | | `HeadlineSmallFontSize` | `Double` | 24 | | `TitleLargeFontFamily` | `String` | `MaterialRegularFontFamily` | | `TitleLargeFontWeight` | `String` | `Normal` | | `TitleLargeFontSize` | `Double` | 22 | | `TitleMediumFontFamily` | `String` | `MaterialMediumFontFamily` | | `TitleMediumFontWeight` | `String` | `Medium` | | `TitleMediumFontSize` | `Double` | 16 | | `TitleSmallFontFamily` | `String` | `MaterialMediumFontFamily` | | `TitleSmallFontWeight` | `String` | `Medium` | | `TitleSmallFontSize` | `Double` | 14 | | `LabelLargeFontFamily` | `String` | `MaterialMediumFontFamily` | | `LabelLargeFontWeight` | `String` | `Medium` | | `LabelLargeFontSize` | `Double` | 14 | | `LabelLargeCharacterSpacing` | `Int32` | 7 | | `LabelMediumFontFamily` | `String` | `MaterialMediumFontFamily` | | `LabelMediumFontWeight` | `String` | `Medium` | | `LabelMediumFontSize` | `Double` | 12 | | `LabelMediumCharacterSpacing` | `Int32` | 41 | | `LabelSmallFontFamily` | `String` | `MaterialMediumFontFamily` | | `LabelSmallFontWeight` | `String` | `Medium` | | `LabelSmallFontSize` | `Double` | 11 | | `LabelSmallCharacterSpacing` | `Int32` | 45 | | `LabelExtraSmallFontFamily` | `String` | `MaterialMediumFontFamily` | | `LabelExtraSmallFontWeight` | `String` | `Normal` | | `LabelExtraSmallFontSize` | `Double` | 11 | | `LabelExtraSmallCharacterSpacing` | `Int32` | 7 | | `BodyLargeFontFamily` | `String` | `MaterialMediumFontFamily` | | `BodyLargeFontWeight` | `String` | `Medium` | | `BodyLargeFontSize` | `Double` | 16 | | `BodyLargeCharacterSpacing` | `Int32` | 9 | | `BodyMediumFontFamily` | `String` | `MaterialMediumFontFamily` | | `BodyMediumFontWeight` | `String` | Medium | | `BodyMediumFontSize` | `Double` | 14 | | `BodyMediumCharacterSpacing` | `Int32` | 17 | | `BodySmallFontFamily` | `String` | `MaterialMediumFontFamily` | | `BodySmallFontWeight` | `String` | `Medium` | | `BodySmallFontSize` | `Double` | 12 | | `BodySmallCharacterSpacing` | `Int32` | 33 | | `CaptionLargeFontFamily` | `String` | `MaterialMediumFontFamily` | | `CaptionLargeFontWeight` | `String` | `Medium` | | `CaptionLargeFontSize` | `Double` | 13 | | `CaptionLargeCharacterSpacing` | `Int32` | -3 | | `CaptionMediumFontFamily` | `String` | `MaterialMediumFontFamily` | | `CaptionMediumFontWeight` | `String` | `Medium` | | `CaptionMediumFontSize` | `Double` | 12 | | `CaptionMediumCharacterSpacing` | `Int32` | 33 | | `CaptionSmallFontFamily` | `String` | `MaterialMediumFontFamily` | | `CaptionSmallFontWeight` | `String` | `Medium` | | `CaptionSmallFontSize` | `Double` | 11 | | `CaptionSmallCharacterSpacing` | `Int32` | 7 | ## Uno.Themes.Styles.TextBox # TextBox Control ## Styles | Style Key | IsDefaultStyle\* | | ---------------------- | ---------------- | | `FilledTextBoxStyle` | | | `OutlinedTextBoxStyle` | True | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | | ------------------------------------------------------------- | ----------------- | ----------------------------- | | `DownscaledHeaderHeaderCompositeTransformTranslateY` | `Double` | -11 | | `DownscaledHeaderPlaceholderTextCompositeTransformTranslateY` | `Double` | 8 | | `DownscaledHeaderTextCompositeTransformTranslateY` | `Double` | 8 | | `DownscaledHeaderCompositeTransformScaleX` | `Double` | 0.7 | | `DownscaledHeaderCompositeTransformScaleY` | `Double` | 0.7 | | `TextBoxDeleteButtonForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `TextBoxDeleteButtonForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `TextBoxDeleteButtonForegroundPressed` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `TextBoxDeleteButtonForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `TextBoxLeadingIconForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `TextBoxLeadingIconForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `FilledTextBoxBackground` | `SolidColorBrush` | `SurfaceVariantBrush` | | `FilledTextBoxBackgroundPointerOver` | `SolidColorBrush` | `OnSurfaceVariantHoverBrush` | | `FilledTextBoxBackgroundFocused` | `SolidColorBrush` | `SurfaceVariantBrush` | | `FilledTextBoxBackgroundDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `FilledTextBoxBorderBrush` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `FilledTextBoxBorderBrushPointerOver` | `SolidColorBrush` | `OnSurfaceBrush` | | `FilledTextBoxBorderBrushFocused` | `SolidColorBrush` | `PrimaryBrush` | | `FilledTextBoxBorderBrushDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `FilledTextBoxDeleteButtonForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `FilledTextBoxDeleteButtonForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `FilledTextBoxDeleteButtonForegroundFocused` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `FilledTextBoxDeleteButtonForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `FilledTextBoxForeground` | `SolidColorBrush` | `OnSurfaceBrush` | | `FilledTextBoxForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceBrush` | | `FilledTextBoxForegroundFocused` | `SolidColorBrush` | `OnSurfaceBrush` | | `FilledTextBoxForegroundDisabled` | `SolidColorBrush` | `OnSurfaceBrush` | | `FilledTextBoxForegroundOpacityDisabled` | `Double` | `LowOpacity` | | `FilledTextBoxPlaceholderForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `FilledTextBoxPlaceholderForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `FilledTextBoxPlaceholderForegroundFocused` | `SolidColorBrush` | `OnSurfaceBrush` | | `FilledTextBoxPlaceholderForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `FilledTextBoxHeaderForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `FilledTextBoxHeaderForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `FilledTextBoxHeaderForegroundFocused` | `SolidColorBrush` | `PrimaryBrush` | | `FilledTextBoxHeaderForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `OutlinedTextBoxBorderBrush` | `SolidColorBrush` | `OutlineBrush` | | `OutlinedTextBoxBorderBrushPointerOver` | `SolidColorBrush` | `OnSurfaceBrush` | | `OutlinedTextBoxBorderBrushFocused` | `SolidColorBrush` | `PrimaryBrush` | | `OutlinedTextBoxBorderBrushDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `OutlinedTextBoxForeground` | `SolidColorBrush` | `OnSurfaceBrush` | | `OutlinedTextBoxForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceBrush` | | `OutlinedTextBoxForegroundFocused` | `SolidColorBrush` | `OnSurfaceBrush` | | `OutlinedTextBoxForegroundDisabled` | `SolidColorBrush` | `OnSurfaceBrush` | | `OutlinedTextBoxForegroundOpacityDisabled` | `Double` | `LowOpacity` | | `OutlinedTextBoxPlaceholderForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `OutlinedTextBoxPlaceholderForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `OutlinedTextBoxPlaceholderForegroundFocused` | `SolidColorBrush` | `OnSurfaceBrush` | | `OutlinedTextBoxPlaceholderForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `OutlinedTextBoxHeaderForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `OutlinedTextBoxHeaderForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `OutlinedTextBoxHeaderForegroundFocused` | `SolidColorBrush` | `PrimaryBrush` | | `OutlinedTextBoxHeaderForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `OutlinedTextBoxFontFamily` | `FontFamily` | `MaterialMediumFontFamily` | | `OutlinedTextBoxFontWeight` | `String` | `BodyLargeFontWeight` | | `OutlinedTextBoxFontSize` | `Double` | `BodyLargeFontSize` | | `OutlinedTextBoxCharacterSpacing` | `Int32` | `BodyLargeCharacterSpacing` | | `FilledTextBoxFontFamily` | `FontFamily` | `MaterialMediumFontFamily` | | `FilledTextBoxFontWeight` | `String` | `BodyLargeFontWeight` | | `FilledTextBoxFontSize` | `Double` | `BodyLargeFontSize` | | `FilledTextBoxCharacterSpacing` | `Int32` | `BodyLargeCharacterSpacing` | | `FilledTextBoxBorderThicknessNormal` | `Double` | `TextBoxOutlinedStrokeHeight` | | `FilledTextBoxBorderThicknessFocused` | `Double` | `TextBoxFocusStrokeWidth` | | `TextBoxClearGlyphWidth` | `Double` | 20 | | `TextBoxClearGlyphHeight` | `Double` | 20 | | `FilledTextBoxCornerRadius` | `CornerRadius` | 4,4,0,0 | | `FilledTextBoxPadding` | `Thickness` | 16,7 | | `FilledTextBoxMinHeight` | `Double` | 58 | | `FilledTextBoxBorderHeightFocused` | `Double` | 2 | | `OutlinedTextBoxBorderThickness` | `Double` | 1 | | `OutlinedTextBoxCornerRadius` | `CornerRadius` | 4 | | `OutlinedTextBoxPadding` | `Thickness` | 8 | | `OutlinedTextBoxMinHeight` | `Double` | 56 | | `OutlinedTextBoxBorderThicknessFocused` | `Double` | 2 | | `OutlinedTextBoxBorderThicknessPointerOver` | `Double` | 2 | ## Uno.Themes.Styles.ToggleButton # ToggleButton Control ## Styles | Style Key | IsDefaultStyle\* | |-------------------------|------------------| | `TextToggleButtonStyle` | | | `IconToggleButtonStyle` | True | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | |-------------------------------------------------------|-------------------|---------------------------------| | `TextToggleButtonBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBackgroundPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBackgroundPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBackgroundDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBackgroundChecked` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBackgroundCheckedPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBackgroundCheckedPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBackgroundCheckedDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBackgroundIndeterminate` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBackgroundIndeterminatePointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBackgroundIndeterminatePressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBackgroundIndeterminateDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonForeground` | `SolidColorBrush` | `PrimaryBrush` | | `TextToggleButtonForegroundPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `TextToggleButtonForegroundPressed` | `SolidColorBrush` | `PrimaryBrush` | | `TextToggleButtonForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `TextToggleButtonForegroundChecked` | `SolidColorBrush` | `PrimaryBrush` | | `TextToggleButtonForegroundCheckedPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `TextToggleButtonForegroundCheckedPressed` | `SolidColorBrush` | `PrimaryBrush` | | `TextToggleButtonForegroundCheckedDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `TextToggleButtonForegroundIndeterminate` | `SolidColorBrush` | `PrimaryBrush` | | `TextToggleButtonForegroundIndeterminatePointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `TextToggleButtonForegroundIndeterminatePressed` | `SolidColorBrush` | `PrimaryBrush` | | `TextToggleButtonForegroundIndeterminateDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `TextToggleButtonFontFamily` | `FontFamily` | `MaterialRegularFontFamily` | | `TextToggleButtonFontSize` | `Double` | `LabelLargeFontSize` | | `TextToggleButtonBorderBrush` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBorderBrushPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBorderBrushPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBorderBrushDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBorderBrushChecked` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBorderBrushCheckedPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBorderBrushCheckedPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBorderBrushCheckedDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBorderBrushIndeterminate` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBorderBrushIndeterminatePointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBorderBrushIndeterminatePressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBorderBrushIndeterminateDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `TextToggleButtonBorderBrushHoverOverlay` | `SolidColorBrush` | `OnSurfaceHoverBrush` | | `TextToggleButtonBorderBrushFocusedOverlay` | `SolidColorBrush` | `OnSurfaceFocusedBrush` | | `TextToggleButtonBorderBrushSelectedOverlay` | `SolidColorBrush` | `OnSurfaceFocusedBrush` | | `TextToggleButtonFeedbackFocused` | `SolidColorBrush` | `OnSurfaceFocusedBrush` | | `TextToggleButtonBorderThickness` | `Thickness` | 0 | | `TextToggleButtonCornerRadius` | `CornerRadius` | 4 | | `TextToggleButtonPadding` | `Thickness` | 16,8 | | `TextToggleButtonMinHeight` | `Double` | 40 | | `IconToggleButtonBackground` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBackgroundPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBackgroundPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBackgroundDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBackgroundChecked` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBackgroundCheckedPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBackgroundCheckedPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBackgroundCheckedDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBackgroundIndeterminate` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBackgroundIndeterminatePointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBackgroundIndeterminatePressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBackgroundIndeterminateDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonForeground` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `IconToggleButtonForegroundPointerOver` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `IconToggleButtonForegroundPressed` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `IconToggleButtonForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `IconToggleButtonForegroundChecked` | `SolidColorBrush` | `PrimaryBrush` | | `IconToggleButtonForegroundCheckedPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `IconToggleButtonForegroundCheckedPressed` | `SolidColorBrush` | `PrimaryBrush` | | `IconToggleButtonForegroundCheckedDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `IconToggleButtonForegroundIndeterminate` | `SolidColorBrush` | `PrimaryBrush` | | `IconToggleButtonForegroundIndeterminatePointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `IconToggleButtonForegroundIndeterminatePressed` | `SolidColorBrush` | `PrimaryBrush` | | `IconToggleButtonForegroundIndeterminateDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `IconToggleButtonBorderBrush` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBorderBrushPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBorderBrushPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBorderBrushDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBorderBrushChecked` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBorderBrushCheckedPointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBorderBrushCheckedPressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBorderBrushCheckedDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBorderBrushIndeterminate` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBorderBrushIndeterminatePointerOver` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBorderBrushIndeterminatePressed` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBorderBrushIndeterminateDisabled` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `IconToggleButtonBorderBrushHoverOverlay` | `SolidColorBrush` | `OnSurfaceHoverBrush` | | `IconToggleButtonBorderBrushFocusedOverlay` | `SolidColorBrush` | `OnSurfaceFocusedBrush` | | `IconToggleButtonBorderBrushSelectedOverlay` | `SolidColorBrush` | `OnSurfaceFocusedBrush` | | `IconToggleButtonStateCircleFill` | `SolidColorBrush` | `PrimaryBrush` | | `IconToggleButtonStateCircleOpacityPointerOver` | `Double` | `HoverOpacity` | | `IconToggleButtonStateCircleOpacityPressed` | `Double` | `PressedOpacity` | | `IconToggleButtonStateCircleOpacityFocused` | `Double` | `FocusedOpacity` | | `IconToggleButtonBorderThickness` | `Thickness` | 0 | | `IconToggleButtonMinHeight` | `Double` | 40 | | `IconToggleButtonMinWidth` | `Double` | 40 | ## Uno.Themes.Styles.ToggleSwitch # ToggleSwitch Control ## Styles | Style Key | IsDefaultStyle\* | |---------------------|------------------| | `ToggleSwitchStyle` | True | IsDefaultStyle\*: Styles in this column will be set as the default implicit style for the matching control ## Lightweight Styling | Key | Type | Value | |--------------------------------------------------|-------------------|---------------------------------| | `ToggleSwitchOffOuterBorderFill` | `SolidColorBrush` | `SurfaceVariantBrush` | | `ToggleSwitchOffOuterBorderStroke` | `SolidColorBrush` | `OutlineBrush` | | `ToggleSwitchOuterBorderStroke` | `SolidColorBrush` | `OutlineBrush` | | `ToggleSwitchOuterBorderFill` | `SolidColorBrush` | `SurfaceVariantBrush` | | `ToggleSwitchKnobOffFill` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `ToggleSwitchKnobOffFillPointerOver` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `ToggleSwitchKnobOffFillFocused` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `ToggleSwitchKnobOffFillPressed` | `SolidColorBrush` | `OnSurfaceVariantBrush` | | `ToggleSwitchKnobOffFillDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `ToggleSwitchKnobOnFill` | `SolidColorBrush` | `OnPrimaryBrush` | | `ToggleSwitchKnobOnFillPointerOver` | `SolidColorBrush` | `PrimaryContainerBrush` | | `ToggleSwitchKnobOnFillFocused` | `SolidColorBrush` | `PrimaryContainerBrush` | | `ToggleSwitchKnobOnFillPressed` | `SolidColorBrush` | `PrimaryContainerBrush` | | `ToggleSwitchKnobOnFillDisabled` | `SolidColorBrush` | `SurfaceBrush` | | `ToggleSwitchKnobOnShadowFill` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ToggleSwitchKnobOnShadowFillPointerOver` | `SolidColorBrush` | `PrimaryHoverBrush` | | `ToggleSwitchKnobOnShadowFillFocused` | `SolidColorBrush` | `PrimaryFocusedBrush` | | `ToggleSwitchKnobOnShadowFillPressed` | `SolidColorBrush` | `PrimaryPressedBrush` | | `ToggleSwitchKnobOffShadowFill` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `ToggleSwitchKnobOffShadowFillPointerOver` | `SolidColorBrush` | `OnSurfaceVariantHoverBrush` | | `ToggleSwitchKnobOffShadowFillFocused` | `SolidColorBrush` | `OnSurfaceVariantFocusedBrush` | | `ToggleSwitchKnobOffShadowFillPressed` | `SolidColorBrush` | `OnSurfaceVariantPressedBrush` | | `ToggleSwitchOnSwitchKnobBoundsFill` | `SolidColorBrush` | `PrimaryBrush` | | `ToggleSwitchKnobBoundsFill` | `SolidColorBrush` | `PrimaryBrush` | | `ToggleSwitchKnobBoundsFillPointerOver` | `SolidColorBrush` | `PrimaryBrush` | | `ToggleSwitchKnobBoundsFillFocused` | `SolidColorBrush` | `PrimaryBrush` | | `ToggleSwitchKnobBoundsFillPressed` | `SolidColorBrush` | `PrimaryBrush` | | `ToggleSwitchKnobBoundsFillDisabled` | `SolidColorBrush` | `OnSurfaceDisabledBrush` | | `ToggleSwitchOffIconPresenterForeground` | `SolidColorBrush` | `SurfaceVariantBrush` | | `ToggleSwitchOffIconPresenterForegroundDisabled` | `SolidColorBrush` | `SurfaceVariantBrush` | | `ToggleSwitchOnIconPresenterForeground` | `SolidColorBrush` | `OnPrimaryContainerBrush` | | `ToggleSwitchOnIconPresenterForegroundDisabled` | `SolidColorBrush` | `OnSurfaceLowBrush` | | `ToggleSwitchThumb` | `SolidColorBrush` | `SystemControlTransparentBrush` | | `SwitchKnobWidth` | `Double` | 52 | | `SwitchKnobIncludingOffShadowWidth` | `Double` | 56 | | `SwitchKnobHeight` | `Double` | 32 | | `SwitchKnobRadius` | `Double` | 16 | | `SwitchKnobStrokeThickness` | `Double` | 2 | | `SwitchKnobShadowSize` | `Double` | 40 | | `SmallThumbSize` | `Double` | 16 | | `MediumThumbSize` | `Double` | 24 | | `LargeThumbSize` | `Double` | 28 | | `KnobIconSize` | `Double` | 16 | | `LargeThumbCornerRadius` | `CornerRadius` | 14 | | `KnobIconPadding` | `Thickness` | 2 | | `KnobOnMargin` | `Thickness` | 2,0,0,0 | | `SwitchKnobOnMargin` | `Thickness` | 26,0,0,0 | | `SwitchKnobOffMargin` | `Thickness` | 0,0,22,0 | | `SwitchKnobOnShadowMargin` | `Thickness` | 20,0,0,0 | | `SwitchKnobOffShadowMargin` | `Thickness` | 0,0,20,0 | ## Uno.Themes.Control.Extensions # Control Extensions > [!IMPORTANT] > UnoFeatures: **Material** — add `Material` to your app's `.csproj` to include the Uno Material resources referenced in these samples. ## Icon This feature allows for the addition of icon on the supported controls. Those icons could be any of the [`IconElement`](https://learn.microsoft.com/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.iconelement)s: ``, ``, ``, or ``. Here are supported control with samples: * TextBox: ```xml ``` * ComboBox: ```xml ``` ## Alternate Content This feature allows putting different content on a control when the state changes. It's control specific and for now, you can only use it with the `ToggleButton` control. ### Alternate Content on ToggleButton ```xml ``` ## Elevation This feature allows to set the level of elevation to depict on the supported control. Setting the elevation on [supported controls](#supported-controls) can result in changes to shadow. [Material Design Elevation Guidance](https://m3.material.io/styles/elevation/overview) ### Example Usage for `Button` The `ElevatedButtonStyle` in Uno Material supports elevation through the use of the `Elevation` attached property. `ElevatedButtonStyle` contains the following `Setter`s: ```xml ... ... ``` Below is an example of how an elevated control may appear: ```xml ``` * Use `Placement="Full"` and a `*DrawerFlyoutPresenterStyle` resource (e.g., `BottomDrawerFlyoutPresenterStyle`). ([Uno Platform][1]) * `VisibleBoundsPadding.PaddingMask="All"` keeps content inside safe areas on mobile. ([Uno Platform][1]) ## Change drawer size (auto / ratio / fixed) **What you get:** Control over the drawer's width/height. **Packages:** `Uno.Toolkit.UI` ```xml ``` * `DrawerLength` accepts `Auto`, `Star` (e.g., `0.66*`), or `Pixel` values. Star range is (0*, 1*]. ([Uno Platform][1]) ## Change the overlay color **What you get:** A custom scrim behind the drawer. **Packages:** `Uno.Toolkit.UI` ```xml ``` * Set `LightDismissOverlayBackground` on the presenter style, not on content. ([Uno Platform][1]) ## Property reference (quick scan) * **OpenDirection** (`DrawerOpenDirection`, default **Up**) — Direction the drawer opens **toward** (drawer appears on the opposite side). ([Uno Platform][1]) * **DrawerLength** (`GridLength`, default **0.66***): `Auto` (fit content), `Star` (ratio of screen; (0*, 1*]), or `Pixel` (fixed). ([Uno Platform][1]) * **LightDismissOverlayBackground** (`Brush`) — Overlay brush (default `#80808080`). ([Uno Platform][1]) * **IsGestureEnabled** (`bool`, default **true**) — Enable drag gestures. ([Uno Platform][1]) * **IsLightDismissEnabled** (`bool`, default **true**) — Tap outside to dismiss. ([Uno Platform][1]) --- [1]: https://platform.uno/docs/articles/external/uno.toolkit.ui/doc/controls/DrawerFlyoutPresenter.html "DrawerFlyoutPresenter " ## Toolkit.Controls.ExtendedSplashScreen.HowTo # Keep the native splash visible while your app finishes loading, and optionally overlay it with your own loading UI **UnoFeatures:** `Toolkit` (add to `` in your `.csproj`) ## How to show a progress ring over the splash **XAML** ```xml ``` This overlays your branding **during** the extended splash—without changing the *native* initial splash asset. ([dotnet new bald][4]) ## Notes & tips * This control **extends** the native splash; it doesn't replace or restyle the initial OS splash. Customize the *initial* splash per platform (e.g., WASM via `AppManifest.js`) separately. ([dotnet new bald][4]) * It's a specialized "loading shell" that sits above your app content and below your optional loading overlay. Think of it as three layers: your app, the captured native splash, and your loading overlay. ([dotnet new bald][4]) * For videos and quick demos, see "ExtendedSplashScreen" in Uno Tech Bites. ([Uno Platform][6]) ## FAQ **Does this let me change the *native* splash?** No. It only prolongs it. Customize the native splash per platform (e.g., WASM `AppManifest.js`). ([Uno Platform][7]) **Will this work on Android 12's SplashScreen API?** Yes—supported in recent Toolkit releases; update packages. ([GitHub][5]) **Can I show anything while loading?** Yes—use `LoadingContentTemplate` (e.g., `ProgressRing`, text, brand). ([Uno Platform][3]) --- **Source doc for reference:** ExtendedSplashScreen control. ([Uno Platform][2]) [1]: https://raw.githubusercontent.com/unoplatform/uno.toolkit.ui/refs/heads/main/doc/getting-started.md "https://raw.githubusercontent.com/unoplatform/uno...." [2]: https://platform.uno/docs/articles/external/uno.toolkit.ui/doc/controls/ExtendedSplashScreen.html "ExtendedSplashScreen" [3]: https://platform.uno/docs/articles/external/uno.chefs/doc/toolkit/ExtendedSplashScreen.html "Extending Splash Screen Duration for Custom Loading" [4]: https://kazo0.dev/toolkit-tuesday/2024/03/12/toolkit-tuesday-extendedsplashscreen.html "Toolkit Tuesdays: ExtendedSplashScreen" [5]: https://github.com/unoplatform/uno.toolkit.ui/releases "Releases · unoplatform/uno.toolkit.ui" [6]: https://platform.uno/blog/uno-toolkit-ui-tech-bites/ "Uno Toolkit – an Uno Tech Bite series" [7]: https://platform.uno/docs/articles/external/uno.wasm.bootstrap/doc/features-splash-screen.html "Splash screen customization" ## Toolkit.Controls.LoadingView.HowTo # Display content with a loading state while async operations run **Packages** * `Uno.Toolkit.UI` (required) ([Uno Platform][1]) ## Wrap your async command so it "talks" to `LoadingView` **Goal:** Minimal `AsyncCommand` that implements `ILoadable`. ```csharp public sealed class AsyncCommand : ICommand, ILoadable { public event EventHandler? CanExecuteChanged; public event EventHandler? IsExecutingChanged; private readonly Func _execute; private bool _isExecuting; public AsyncCommand(Func execute) => _execute = execute; public bool IsExecuting { get => _isExecuting; private set { if (_isExecuting == value) return; _isExecuting = value; IsExecutingChanged?.Invoke(this, EventArgs.Empty); CanExecuteChanged?.Invoke(this, EventArgs.Empty); } } public bool CanExecute(object? parameter) => !IsExecuting; public async void Execute(object? parameter) { try { IsExecuting = true; await _execute(); } finally { IsExecuting = false; } } } ``` Bind this command instance to `LoadingView.Source` and to your `Button.Command`. ([Uno Platform][1]) ## Swap the default loader UI for your own **Goal:** Use `LoadingContent`/`LoadingContentTemplate` for a branded wait state. ```xml ``` Prefer `LoadingContentTemplate` if you need data-binding within the template; use `LoadingContentTemplateSelector` to pick templates dynamically. ([Uno Platform][1]) ## API surface (for skimmers) * **Properties:** `Source (ILoadable)`, `LoadingContent`, `LoadingContentTemplate`, `LoadingContentTemplateSelector`, `UseTransitions (bool)`. * **Helpers:** `LoadableSource`, `CompositeLoadableSource`. ([Uno Platform][1]) *Source: Official Uno Toolkit docs and samples referenced above.* [1]: https://platform.uno/docs/articles/external/uno.toolkit.ui/doc/controls/LoadingView.html "LoadingView " [3]: https://platform.uno/docs/articles/external/uno.toolkit.ui/doc/controls/ExtendedSplashScreen.html "ExtendedSplashScreen" ## Toolkit.Controls.NavigationBar.HowTo # Display a cross-platform navigation bar with back and actions **UnoFeatures:** `Toolkit` (add to `` in your `.csproj`). Add your design system packages (e.g., `Material` or `Cupertino`) if you use those styles. Add the namespace once in your XAML: ```xml xmlns:utu="using:Uno.Toolkit.UI" ``` ## Use a hamburger (or any action) instead of back Set **MainCommandMode** to `Action` and provide a custom `AppBarButton`. ```xml ``` * Use `Action` when the left command isn't back (e.g., burger, prompt). ([Uno Platform][1]) ## Add overflow menu (Android only) Use `SecondaryCommands` — it shows as an overflow (ellipsis) on Android; iOS doesn't support it. ```xml ``` * Not supported on iOS. ([Uno Platform][1]) ## Put custom content (e.g., a search box) in the title area `Content` can be a `FrameworkElement` and uses the available center region. ```xml ``` * `Horizontal/VerticalContentAlignment` are ignored; on iOS content centers unless `HorizontalAlignment="Stretch"`. ([Uno Platform][1]) ## Respect safe areas (notches/punch-holes) Padding is applied automatically on iOS/Android (`SafeArea.Insets=Top`). No extra work needed for typical layouts. ([Uno Platform][1]) ### Notes for RAG indexers * Properties frequently asked: `MainCommandMode`, `PrimaryCommands`, `SecondaryCommands`, `Foreground`, `Content`, platform **heights**, **placement** rules. ([Uno Platform][1]) [1]: https://platform.uno/docs/articles/external/uno.toolkit.ui/doc/controls/NavigationBar.html "NavigationBar " [2]: https://platform.uno/docs/articles/external/figma-docs/components/navigation-bar.html "Navigation Bar" ## Toolkit.Controls.ResponsiveView.HowTo # Create responsive layouts based on Window width breakpoints **UnoFeatures:** `Toolkit` (add to `` in your `.csproj`) ## Change the breakpoints (per-control) ```xml ``` `ResponsiveLayout` lets you override breakpoints for `Narrowest`, `Narrow`, `Normal`, `Wide`, `Widest` (defaults: 150, 300, 600, 800, 1080). ([Uno Platform][2]) ## Use only two templates (phone vs. desktop) ```xml ``` You don't need to define all five templates. `ResponsiveView` chooses from what you provide and still resolves correctly. ([Uno Platform][2]) ## Copy-paste snippets ### Minimal XAML ```xml ``` ### Customize breakpoints ```xml ``` *Source page summarized & refactored for outcome-oriented how-tos.* ([Uno Platform][2]) [1]: https://www.nuget.org/packages/Uno.Toolkit.UI [2]: https://platform.uno/docs/articles/external/uno.toolkit.ui/doc/controls/ResponsiveView.html [3]: https://platform.uno/docs/articles/external/uno.toolkit.ui/doc/helpers/ResponsiveExtension.html ## Toolkit.Controls.SafeArea.HowTo # Keep content out of notches and system bars > `SafeArea` keeps interactive content inside the unobscured screen area (status bars, notches, rounded corners) and can adapt to the on-screen keyboard. It works by aligning content to `ApplicationView.VisibleBounds`. ([Uno Platform][1]) **UnoFeatures:** `Toolkit` (add to `` in your `.csproj`) **Outcome:** your page content never hides under the status bar / rounded corners. ```xml ``` **Why this works:** `SafeArea` overrides padding/margin so content stays within `VisibleBounds`. Prefer it over the older `VisibleBoundsPadding` behavior. ([Uno Platform][1]) ## Respect the on-screen keyboard **Outcome:** inputs aren't hidden by the soft keyboard; the layout shifts safely. ```xml