From d01dc7c45054298f7261c1541734b1c1adc1e773 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Tue, 17 Feb 2026 09:19:57 +0100 Subject: [PATCH 01/25] Update to Uno 6.x, drop Uno.UI --- Build-Toolkit-Components.ps1 | 14 ++++----- Build-Toolkit-Gallery.ps1 | 29 +++++++++---------- GenerateAllSolution.ps1 | 25 +++++++--------- GenerateSingleSolution.ps1 | 23 +++++++-------- MultiTarget/AvailableTargetFrameworks.props | 16 ++++------ MultiTarget/Defaults.props | 2 +- MultiTarget/DefinedConstants.props | 4 +-- MultiTarget/EnabledTargetFrameworks.props | 6 ++-- MultiTarget/Filter-Supported-Components.ps1 | 4 +-- MultiTarget/GenerateAllProjectReferences.ps1 | 4 +-- ...eMultiTargetAwareProjectReferenceProps.ps1 | 8 ++--- ...TargetAwareProjectReference.props.template | 2 -- ...getAwareSharedProjectImport.props.template | 2 -- MultiTarget/MultiTargetIdentifiers.props | 12 +------- MultiTarget/PackageReferences/Uno.props | 22 +++----------- MultiTarget/Test-Component-Support.ps1 | 12 ++++---- MultiTarget/UseTargetFrameworks.ps1 | 6 ++-- MultiTarget/UseUnoWinUI.ps1 | 2 -- .../App.Head.Uno.UI.Dependencies.props | 10 ------- .../App.Head.Uno.WinUI.Dependencies.props | 2 +- ProjectHeads/App.Head.Uno.props | 6 +--- ProjectHeads/App.Head.Wasm.props | 4 +-- ProjectHeads/GenerateSingleSampleHeads.ps1 | 2 +- ProjectTemplate/src/MultiTarget.props | 2 +- 24 files changed, 79 insertions(+), 140 deletions(-) delete mode 100644 ProjectHeads/App.Head.Uno.UI.Dependencies.props diff --git a/Build-Toolkit-Components.ps1 b/Build-Toolkit-Components.ps1 index 6cbc0ec5..94e30757 100644 --- a/Build-Toolkit-Components.ps1 +++ b/Build-Toolkit-Components.ps1 @@ -57,11 +57,11 @@ Date: 2/19/2024 #> Param ( - [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] + [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] [Alias("mt")] [string[]]$MultiTargets = @('uwp', 'wasm', 'wasdk'), # default settings - - [ValidateSet('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] + + [ValidateSet('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] [string[]]$ExcludeMultiTargets = @(), # default settings [Alias("c")] @@ -97,7 +97,7 @@ Param ( if ($MultiTargets -eq 'all') { - $MultiTargets = @('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard') + $MultiTargets = @('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard') } if ($null -eq $ExcludeMultiTargets) @@ -105,11 +105,11 @@ if ($null -eq $ExcludeMultiTargets) $ExcludeMultiTargets = @() } -# Both uwp and wasdk share a targetframework. Both cannot be enabled at once. -# If both are supplied, remove one based on WinUIMajorVersion. +# WinUI 2 only builds native UWP (Uno.UI dropped in Uno 6). +# WinUI 3 excludes UWP. Both uwp and wasdk share a targetframework and cannot be enabled at once. if ($WinUIMajorVersion -eq 2) { - $ExcludeMultiTargets = $ExcludeMultiTargets + 'wasdk' + $ExcludeMultiTargets = $ExcludeMultiTargets + 'wasdk' + 'wasm' + 'macos' + 'ios' + 'android' } if ($WinUIMajorVersion -eq 3) diff --git a/Build-Toolkit-Gallery.ps1 b/Build-Toolkit-Gallery.ps1 index 7d92154e..06d85adc 100644 --- a/Build-Toolkit-Gallery.ps1 +++ b/Build-Toolkit-Gallery.ps1 @@ -9,7 +9,7 @@ Specifies the MultiTarget TFM(s) to include for building the components. The default value is 'all'. .PARAMETER ExcludeMultiTargets - Specifies the MultiTarget TFM(s) to exclude for building the components. The default value excludes targets that require additional tooling or workloads to build: 'wpf', 'linuxgtk', 'macos', 'ios', and 'android'. Run uno-check to install the required workloads. + Specifies the MultiTarget TFM(s) to exclude for building the components. The default value excludes targets that require additional tooling or workloads to build. Run uno-check to install the required workloads. .PARAMETER Heads The heads to include in the build. Default is 'Uwp', 'Wasdk', 'Wasm'. @@ -46,11 +46,11 @@ Date: 2/19/2024 #> Param ( - [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] + [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] [Alias("mt")] [string[]]$MultiTargets = @('uwp', 'wasdk', 'wasm'), # default settings - - [ValidateSet('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] + + [ValidateSet('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] [string[]]$ExcludeMultiTargets = @(), # default settings [ValidateSet('all', 'Uwp', 'Wasdk', 'Wasm', 'Tests.Uwp', 'Tests.Wasdk')] @@ -87,22 +87,19 @@ if ($null -eq $ExcludeMultiTargets) $ExcludeMultiTargets = @() } -# Both uwp and wasdk share a targetframework. Both cannot be enabled at once. -# If both are supplied, remove one based on WinUIMajorVersion. -if ($MultiTargets.Contains('uwp') -and $MultiTargets.Contains('wasdk')) +# WinUI 2 only builds native UWP (Uno.UI dropped in Uno 6). +# WinUI 3 excludes UWP. Both uwp and wasdk share a targetframework and cannot be enabled at once. +if ($WinUIMajorVersion -eq 2) { - if ($WinUIMajorVersion -eq 2) - { - $ExcludeMultiTargets = $ExcludeMultiTargets + 'wasdk' - } - else - { - $ExcludeMultiTargets = $ExcludeMultiTargets + 'uwp' - } + $ExcludeMultiTargets = $ExcludeMultiTargets + 'wasdk' + 'wasm' + 'macos' + 'ios' + 'android' +} +else +{ + $ExcludeMultiTargets = $ExcludeMultiTargets + 'uwp' } if ($MultiTargets -eq 'all') { - $MultiTargets = @('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard') + $MultiTargets = @('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard') } if ($ExcludeMultiTargets) { diff --git a/GenerateAllSolution.ps1 b/GenerateAllSolution.ps1 index 72eb9bac..47ad59a4 100644 --- a/GenerateAllSolution.ps1 +++ b/GenerateAllSolution.ps1 @@ -38,11 +38,11 @@ Date: April 27, 2022 #> Param ( - [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] + [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] [Alias("mt")] [string[]]$MultiTargets = @('uwp', 'wasm', 'wasdk'), - [ValidateSet('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] + [ValidateSet('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] [string[]]$ExcludeMultiTargets = @(), # default settings [Alias("c")] @@ -59,7 +59,7 @@ Param ( ) if ($MultiTargets.Contains('all')) { - $MultiTargets = @('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard') + $MultiTargets = @('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard') } if ($null -eq $ExcludeMultiTargets) @@ -67,18 +67,15 @@ if ($null -eq $ExcludeMultiTargets) $ExcludeMultiTargets = @() } -# Both uwp and wasdk share a targetframework. Both cannot be enabled at once. -# If both are supplied, remove one based on WinUIMajorVersion. -if ($MultiTargets.Contains('uwp') -and $MultiTargets.Contains('wasdk')) +# WinUI 2 only builds native UWP (Uno.UI dropped in Uno 6). +# WinUI 3 excludes UWP. Both uwp and wasdk share a targetframework and cannot be enabled at once. +if ($WinUIMajorVersion -eq 2) { - if ($WinUIMajorVersion -eq 2) - { - $ExcludeMultiTargets = $ExcludeMultiTargets + 'wasdk' - } - else - { - $ExcludeMultiTargets = $ExcludeMultiTargets + 'uwp' - } + $ExcludeMultiTargets = $ExcludeMultiTargets + 'wasdk' + 'wasm' + 'macos' + 'ios' + 'android' +} +else +{ + $ExcludeMultiTargets = $ExcludeMultiTargets + 'uwp' } $MultiTargets = $MultiTargets | Where-Object { $_ -notin $ExcludeMultiTargets } diff --git a/GenerateSingleSolution.ps1 b/GenerateSingleSolution.ps1 index e0e73d7d..606745bc 100644 --- a/GenerateSingleSolution.ps1 +++ b/GenerateSingleSolution.ps1 @@ -33,7 +33,7 @@ Date: Feb 9, 2023 #> Param ( - [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android')] + [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android')] [Alias("mt")] [string[]]$MultiTargets = @('uwp', 'wasm', 'wasdk'), @@ -98,7 +98,7 @@ if (-not (Test-Path "$componentPath/src" -PathType Container)) # ----------------- if ($MultiTargets.Contains('all')) { - $MultiTargets = @('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android') + $MultiTargets = @('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android') } if ($null -eq $ExcludeMultiTargets) @@ -106,18 +106,15 @@ if ($null -eq $ExcludeMultiTargets) $ExcludeMultiTargets = @() } -# Both uwp and wasdk share a targetframework. Both cannot be enabled at once. -# If both are supplied, remove one based on WinUIMajorVersion. -if ($MultiTargets.Contains('uwp') -and $MultiTargets.Contains('wasdk')) +# WinUI 2 only builds native UWP (Uno.UI dropped in Uno 6). +# WinUI 3 excludes UWP. Both uwp and wasdk share a targetframework and cannot be enabled at once. +if ($WinUIMajorVersion -eq 2) { - if ($WinUIMajorVersion -eq 2) - { - $ExcludeMultiTargets = $ExcludeMultiTargets + 'wasdk' - } - else - { - $ExcludeMultiTargets = $ExcludeMultiTargets + 'uwp' - } + $ExcludeMultiTargets = $ExcludeMultiTargets + 'wasdk' + 'wasm' + 'macos' + 'ios' + 'android' +} +else +{ + $ExcludeMultiTargets = $ExcludeMultiTargets + 'uwp' } $MultiTargets = $MultiTargets | Where-Object { $_ -notin $ExcludeMultiTargets } diff --git a/MultiTarget/AvailableTargetFrameworks.props b/MultiTarget/AvailableTargetFrameworks.props index 02f9d9aa..4c402610 100644 --- a/MultiTarget/AvailableTargetFrameworks.props +++ b/MultiTarget/AvailableTargetFrameworks.props @@ -12,21 +12,17 @@ uap10.0.17763;net8.0-windows10.0.26100.0;net9.0-windows10.0.26100.0; net9.0-windows10.0.19041.0;net8.0-windows10.0.19041.0; - net9.0; - net9.0; - net9.0; + net9.0;net10.0; - net9.0-android; - net9.0-maccatalyst; - net9.0-ios; + net9.0-android;net10.0-android; + net9.0-maccatalyst;net10.0-maccatalyst; + net9.0-ios;net10.0-ios; - net9.0; - net9.0; - net9.0; + net9.0;net10.0; netstandard2.0; - net9.0; + net9.0;net10.0; \ No newline at end of file diff --git a/MultiTarget/Defaults.props b/MultiTarget/Defaults.props index 86e5e82f..20665cb2 100644 --- a/MultiTarget/Defaults.props +++ b/MultiTarget/Defaults.props @@ -1,5 +1,5 @@ - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wasm;macos;ios;android; \ No newline at end of file diff --git a/MultiTarget/DefinedConstants.props b/MultiTarget/DefinedConstants.props index b5c8c2c9..2a2b6968 100644 --- a/MultiTarget/DefinedConstants.props +++ b/MultiTarget/DefinedConstants.props @@ -12,9 +12,7 @@ $(DefineConstants);__ANDROID__; $(DefineConstants);__IOS__; $(DefineConstants);__MACOS__; - $(DefineConstants);HAS_UNO_SKIA;__SKIA__;WINDOWS_WPF; - $(DefineConstants);HAS_UNO_SKIA;__SKIA__;__GTK__; - + $(DefineConstants);NET10_0_OR_GREATER $(DefineConstants);NET9_0_OR_GREATER $(DefineConstants);NET8_0_OR_GREATER $(DefineConstants);NET7_0_OR_GREATER diff --git a/MultiTarget/EnabledTargetFrameworks.props b/MultiTarget/EnabledTargetFrameworks.props index 6f1c0ab9..ca4bb1ec 100644 --- a/MultiTarget/EnabledTargetFrameworks.props +++ b/MultiTarget/EnabledTargetFrameworks.props @@ -10,11 +10,11 @@ $(TargetFrameworks);$(WinAppSdkTargetFrameworks) - true - true + true + true $(TargetFrameworks);$(DotnetCommonTargetFramework) $(TargetFrameworks);$(MacOSLibTargetFrameworks) diff --git a/MultiTarget/Filter-Supported-Components.ps1 b/MultiTarget/Filter-Supported-Components.ps1 index bc187e85..db01e964 100644 --- a/MultiTarget/Filter-Supported-Components.ps1 +++ b/MultiTarget/Filter-Supported-Components.ps1 @@ -17,7 +17,7 @@ Date: 6/6/2025 #> Param ( - [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] + [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] [Alias("mt")] [Parameter(Mandatory=$true)] [string[]]$MultiTargets, @@ -32,7 +32,7 @@ Param ( ) if ($MultiTargets -eq 'all') { - $MultiTargets = @('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard') + $MultiTargets = @('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard') } $supportedComponents = @(); diff --git a/MultiTarget/GenerateAllProjectReferences.ps1 b/MultiTarget/GenerateAllProjectReferences.ps1 index 62ca3b02..43d4f262 100644 --- a/MultiTarget/GenerateAllProjectReferences.ps1 +++ b/MultiTarget/GenerateAllProjectReferences.ps1 @@ -4,8 +4,8 @@ Param ( [Parameter(HelpMessage = "Only projects that support these targets will have references generated for use by deployable heads.")] [Alias("mt")] - [ValidateSet('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] - [string[]]$MultiTargets = @("uwp", "wasdk", "wpf", "wasm", "linuxgtk", "macos", "ios", "android", "netstandard"), + [ValidateSet('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] + [string[]]$MultiTargets = @("uwp", "wasdk", "wasm", "macos", "ios", "android", "netstandard"), [Parameter(HelpMessage = "The names of the components to generate references for. Defaults to all components.")] [string[]]$Components = @("all"), diff --git a/MultiTarget/GenerateMultiTargetAwareProjectReferenceProps.ps1 b/MultiTarget/GenerateMultiTargetAwareProjectReferenceProps.ps1 index dbbd6728..a7b2849f 100644 --- a/MultiTarget/GenerateMultiTargetAwareProjectReferenceProps.ps1 +++ b/MultiTarget/GenerateMultiTargetAwareProjectReferenceProps.ps1 @@ -15,9 +15,9 @@ Param ( [string]$projectRootPlaceholder = "[ProjectRoot]", [Parameter(HelpMessage = "Only projects that support these targets will have references generated for use by deployable heads.")] - [ValidateSet("uwp", "wasdk", "wpf", "wasm", "linuxgtk", "macos", "ios", "android", "netstandard")] + [ValidateSet("uwp", "wasdk", "wasm", "macos", "ios", "android", "netstandard")] [Alias("mt")] - [string[]] $MultiTargets = @("uwp", "wasdk", "wpf", "wasm", "linuxgtk", "macos", "ios", "android", "netstandard") + [string[]] $MultiTargets = @("uwp", "wasdk", "wasm", "macos", "ios", "android", "netstandard") ) if ($projectPath.EndsWith(".projitems")) { @@ -74,7 +74,7 @@ function ShouldMultiTargetMsBuildValue([string] $target) { return $(ShouldMultiTarget $target).ToString().ToLower() } -$targeted = @("uwp", "wasdk", "wpf", "wasm", "linuxgtk", "macos", "ios", "android", "netstandard").Where({ ShouldMultiTarget $_ }) +$targeted = @("uwp", "wasdk", "wasm", "macos", "ios", "android", "netstandard").Where({ ShouldMultiTarget $_ }) if ($targeted.Count -gt 0) { Write-Host "Generating project references for $([System.IO.Path]::GetFileNameWithoutExtension($projectFileName)): $($targeted -Join ', ')" @@ -83,8 +83,6 @@ if ($targeted.Count -gt 0) { $templateContents = $templateContents -replace [regex]::escape("[CanTargetWasm]"), "'$(ShouldMultiTargetMsBuildValue "wasm")'"; $templateContents = $templateContents -replace [regex]::escape("[CanTargetUwp]"), "'$(ShouldMultiTargetMsBuildValue "uwp")'"; $templateContents = $templateContents -replace [regex]::escape("[CanTargetWasdk]"), "'$(ShouldMultiTargetMsBuildValue "wasdk")'"; -$templateContents = $templateContents -replace [regex]::escape("[CanTargetWpf]"), "'$(ShouldMultiTargetMsBuildValue "wpf")'"; -$templateContents = $templateContents -replace [regex]::escape("[CanTargetLinuxGtk]"), "'$(ShouldMultiTargetMsBuildValue "linuxgtk")'"; $templateContents = $templateContents -replace [regex]::escape("[CanTargetMacOS]"), "'$(ShouldMultiTargetMsBuildValue "macos")'"; $templateContents = $templateContents -replace [regex]::escape("[CanTargetiOS]"), "'$(ShouldMultiTargetMsBuildValue "ios")'"; $templateContents = $templateContents -replace [regex]::escape("[CanTargetDroid]"), "'$(ShouldMultiTargetMsBuildValue "android")'"; diff --git a/MultiTarget/MultiTargetAwareProjectReference.props.template b/MultiTarget/MultiTargetAwareProjectReference.props.template index 86b3c4d8..5d3bb133 100644 --- a/MultiTarget/MultiTargetAwareProjectReference.props.template +++ b/MultiTarget/MultiTargetAwareProjectReference.props.template @@ -10,8 +10,6 @@ true - true - true true true true @@ -29,14 +27,6 @@ true true - true - true - true - - true - true - true - true true @@ -47,7 +37,7 @@ true true - true + true - + true - - + + - - - - - - - - - - - $(NoWarn);NU1701; - - - - - - - - - - - diff --git a/ProjectHeads/App.Head.Uno.WinUI.Dependencies.props b/ProjectHeads/App.Head.Uno.WinUI.Dependencies.props index d18fbfb5..608b7cec 100644 --- a/ProjectHeads/App.Head.Uno.WinUI.Dependencies.props +++ b/ProjectHeads/App.Head.Uno.WinUI.Dependencies.props @@ -4,6 +4,6 @@ - + diff --git a/ProjectHeads/App.Head.Uno.props b/ProjectHeads/App.Head.Uno.props index 865ea717..618faaa3 100644 --- a/ProjectHeads/App.Head.Uno.props +++ b/ProjectHeads/App.Head.Uno.props @@ -23,10 +23,6 @@ $(NoWarn);Uno0006 - + diff --git a/ProjectHeads/App.Head.Wasm.props b/ProjectHeads/App.Head.Wasm.props index ed7c9705..6e288281 100644 --- a/ProjectHeads/App.Head.Wasm.props +++ b/ProjectHeads/App.Head.Wasm.props @@ -79,8 +79,8 @@ - - + + diff --git a/ProjectHeads/GenerateSingleSampleHeads.ps1 b/ProjectHeads/GenerateSingleSampleHeads.ps1 index 0bbee407..15adecd8 100644 --- a/ProjectHeads/GenerateSingleSampleHeads.ps1 +++ b/ProjectHeads/GenerateSingleSampleHeads.ps1 @@ -30,7 +30,7 @@ Date: Feb 9, 2023 #> Param ( - [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android')] + [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android')] [Alias("mt")] [string[]]$MultiTargets = @('uwp', 'wasm', 'wasdk'), diff --git a/ProjectTemplate/src/MultiTarget.props b/ProjectTemplate/src/MultiTarget.props index b11c1942..caab2d42 100644 --- a/ProjectTemplate/src/MultiTarget.props +++ b/ProjectTemplate/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wasm;macos;ios;android; \ No newline at end of file From e70d8d9333f8a7c3fd904989ae34d0a20da139e5 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Tue, 17 Feb 2026 10:51:43 +0100 Subject: [PATCH 02/25] Update to .NET 10 compatible Uno.WinUI version --- .github/workflows/build.yml | 3 +++ MultiTarget/PackageReferences/Uno.props | 4 ++-- ProjectHeads/App.Head.Uno.WinUI.Dependencies.props | 2 +- ProjectHeads/App.Head.Wasm.props | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2049b492..dba292a4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -146,6 +146,9 @@ jobs: # WinUI 2 not supported on wasdk - winui: 2 multitarget: wasdk + # WinUI 2 not supported on wasm (Uno 6.x dropped Uno.UI) + - winui: 2 + multitarget: wasm # WinUI 3 not supported on uwp - winui: 3 multitarget: uwp diff --git a/MultiTarget/PackageReferences/Uno.props b/MultiTarget/PackageReferences/Uno.props index 1050481e..198483d9 100644 --- a/MultiTarget/PackageReferences/Uno.props +++ b/MultiTarget/PackageReferences/Uno.props @@ -1,12 +1,12 @@ - 6.0.465 + 6.4.229 - + diff --git a/ProjectHeads/App.Head.Uno.WinUI.Dependencies.props b/ProjectHeads/App.Head.Uno.WinUI.Dependencies.props index 608b7cec..77c9bc88 100644 --- a/ProjectHeads/App.Head.Uno.WinUI.Dependencies.props +++ b/ProjectHeads/App.Head.Uno.WinUI.Dependencies.props @@ -4,6 +4,6 @@ - + diff --git a/ProjectHeads/App.Head.Wasm.props b/ProjectHeads/App.Head.Wasm.props index 6e288281..6625207a 100644 --- a/ProjectHeads/App.Head.Wasm.props +++ b/ProjectHeads/App.Head.Wasm.props @@ -79,7 +79,7 @@ - + From b17dd30a1cb78be5c6e0021a888989a6b61fb103 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Tue, 17 Feb 2026 14:31:17 +0100 Subject: [PATCH 03/25] chore: Keep .NET 9 targets --- MultiTarget/AvailableTargetFrameworks.props | 12 ++++++------ MultiTarget/DefinedConstants.props | 1 - ProjectHeads/App.Head.Wasm.props | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/MultiTarget/AvailableTargetFrameworks.props b/MultiTarget/AvailableTargetFrameworks.props index 4c402610..7ea4cd34 100644 --- a/MultiTarget/AvailableTargetFrameworks.props +++ b/MultiTarget/AvailableTargetFrameworks.props @@ -12,17 +12,17 @@ uap10.0.17763;net8.0-windows10.0.26100.0;net9.0-windows10.0.26100.0; net9.0-windows10.0.19041.0;net8.0-windows10.0.19041.0; - net9.0;net10.0; + net9.0; - net9.0-android;net10.0-android; - net9.0-maccatalyst;net10.0-maccatalyst; - net9.0-ios;net10.0-ios; + net9.0-android; + net9.0-maccatalyst; + net9.0-ios; - net9.0;net10.0; + net9.0; netstandard2.0; - net9.0;net10.0; + net9.0; \ No newline at end of file diff --git a/MultiTarget/DefinedConstants.props b/MultiTarget/DefinedConstants.props index 2a2b6968..37f46b79 100644 --- a/MultiTarget/DefinedConstants.props +++ b/MultiTarget/DefinedConstants.props @@ -12,7 +12,6 @@ $(DefineConstants);__ANDROID__; $(DefineConstants);__IOS__; $(DefineConstants);__MACOS__; - $(DefineConstants);NET10_0_OR_GREATER $(DefineConstants);NET9_0_OR_GREATER $(DefineConstants);NET8_0_OR_GREATER $(DefineConstants);NET7_0_OR_GREATER diff --git a/ProjectHeads/App.Head.Wasm.props b/ProjectHeads/App.Head.Wasm.props index 6625207a..7c8c4f1b 100644 --- a/ProjectHeads/App.Head.Wasm.props +++ b/ProjectHeads/App.Head.Wasm.props @@ -80,7 +80,7 @@ - + From 566fc13cc4fd13caa60769386071f6ca2334485a Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Fri, 20 Feb 2026 09:42:27 +0100 Subject: [PATCH 04/25] Restore Uno 5.x for UWP targeting --- .github/workflows/build.yml | 3 -- Build-Toolkit-Components.ps1 | 12 ++--- Build-Toolkit-Gallery.ps1 | 27 ++++++----- GenerateAllSolution.ps1 | 25 +++++----- GenerateSingleSolution.ps1 | 23 +++++---- MultiTarget/AvailableTargetFrameworks.props | 6 ++- MultiTarget/Defaults.props | 2 +- MultiTarget/DefinedConstants.props | 3 ++ MultiTarget/EnabledTargetFrameworks.props | 6 +-- MultiTarget/Filter-Supported-Components.ps1 | 4 +- MultiTarget/GenerateAllProjectReferences.ps1 | 4 +- ...eMultiTargetAwareProjectReferenceProps.ps1 | 8 ++-- ...TargetAwareProjectReference.props.template | 2 + ...getAwareSharedProjectImport.props.template | 2 + MultiTarget/MultiTargetIdentifiers.props | 12 ++++- MultiTarget/PackageReferences/Uno.props | 48 +++++++++++++++++-- MultiTarget/Test-Component-Support.ps1 | 10 ++-- MultiTarget/UseTargetFrameworks.ps1 | 6 +-- .../App.Head.Uno.UI.Dependencies.props | 8 ++++ ProjectHeads/App.Head.Uno.props | 9 +++- ProjectHeads/App.Head.Wasm.props | 2 +- ProjectHeads/GenerateSingleSampleHeads.ps1 | 2 +- ProjectTemplate/src/MultiTarget.props | 2 +- 23 files changed, 154 insertions(+), 72 deletions(-) create mode 100644 ProjectHeads/App.Head.Uno.UI.Dependencies.props diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dba292a4..2049b492 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -146,9 +146,6 @@ jobs: # WinUI 2 not supported on wasdk - winui: 2 multitarget: wasdk - # WinUI 2 not supported on wasm (Uno 6.x dropped Uno.UI) - - winui: 2 - multitarget: wasm # WinUI 3 not supported on uwp - winui: 3 multitarget: uwp diff --git a/Build-Toolkit-Components.ps1 b/Build-Toolkit-Components.ps1 index 94e30757..438be416 100644 --- a/Build-Toolkit-Components.ps1 +++ b/Build-Toolkit-Components.ps1 @@ -57,11 +57,11 @@ Date: 2/19/2024 #> Param ( - [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] + [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] [Alias("mt")] [string[]]$MultiTargets = @('uwp', 'wasm', 'wasdk'), # default settings - [ValidateSet('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] + [ValidateSet('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] [string[]]$ExcludeMultiTargets = @(), # default settings [Alias("c")] @@ -97,7 +97,7 @@ Param ( if ($MultiTargets -eq 'all') { - $MultiTargets = @('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard') + $MultiTargets = @('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard') } if ($null -eq $ExcludeMultiTargets) @@ -105,11 +105,11 @@ if ($null -eq $ExcludeMultiTargets) $ExcludeMultiTargets = @() } -# WinUI 2 only builds native UWP (Uno.UI dropped in Uno 6). -# WinUI 3 excludes UWP. Both uwp and wasdk share a targetframework and cannot be enabled at once. +# Both uwp and wasdk share a targetframework. Both cannot be enabled at once. +# If both are supplied, remove one based on WinUIMajorVersion. if ($WinUIMajorVersion -eq 2) { - $ExcludeMultiTargets = $ExcludeMultiTargets + 'wasdk' + 'wasm' + 'macos' + 'ios' + 'android' + $ExcludeMultiTargets = $ExcludeMultiTargets + 'wasdk' } if ($WinUIMajorVersion -eq 3) diff --git a/Build-Toolkit-Gallery.ps1 b/Build-Toolkit-Gallery.ps1 index 06d85adc..566ba237 100644 --- a/Build-Toolkit-Gallery.ps1 +++ b/Build-Toolkit-Gallery.ps1 @@ -9,7 +9,7 @@ Specifies the MultiTarget TFM(s) to include for building the components. The default value is 'all'. .PARAMETER ExcludeMultiTargets - Specifies the MultiTarget TFM(s) to exclude for building the components. The default value excludes targets that require additional tooling or workloads to build. Run uno-check to install the required workloads. + Specifies the MultiTarget TFM(s) to exclude for building the components. The default value excludes targets that require additional tooling or workloads to build: 'wpf', 'linuxgtk', 'macos', 'ios', and 'android'. Run uno-check to install the required workloads. .PARAMETER Heads The heads to include in the build. Default is 'Uwp', 'Wasdk', 'Wasm'. @@ -46,11 +46,11 @@ Date: 2/19/2024 #> Param ( - [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] + [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] [Alias("mt")] [string[]]$MultiTargets = @('uwp', 'wasdk', 'wasm'), # default settings - [ValidateSet('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] + [ValidateSet('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] [string[]]$ExcludeMultiTargets = @(), # default settings [ValidateSet('all', 'Uwp', 'Wasdk', 'Wasm', 'Tests.Uwp', 'Tests.Wasdk')] @@ -87,19 +87,22 @@ if ($null -eq $ExcludeMultiTargets) $ExcludeMultiTargets = @() } -# WinUI 2 only builds native UWP (Uno.UI dropped in Uno 6). -# WinUI 3 excludes UWP. Both uwp and wasdk share a targetframework and cannot be enabled at once. -if ($WinUIMajorVersion -eq 2) +# Both uwp and wasdk share a targetframework. Both cannot be enabled at once. +# If both are supplied, remove one based on WinUIMajorVersion. +if ($MultiTargets.Contains('uwp') -and $MultiTargets.Contains('wasdk')) { - $ExcludeMultiTargets = $ExcludeMultiTargets + 'wasdk' + 'wasm' + 'macos' + 'ios' + 'android' -} -else -{ - $ExcludeMultiTargets = $ExcludeMultiTargets + 'uwp' + if ($WinUIMajorVersion -eq 2) + { + $ExcludeMultiTargets = $ExcludeMultiTargets + 'wasdk' + } + else + { + $ExcludeMultiTargets = $ExcludeMultiTargets + 'uwp' + } } if ($MultiTargets -eq 'all') { - $MultiTargets = @('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard') + $MultiTargets = @('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard') } if ($ExcludeMultiTargets) { diff --git a/GenerateAllSolution.ps1 b/GenerateAllSolution.ps1 index 47ad59a4..72eb9bac 100644 --- a/GenerateAllSolution.ps1 +++ b/GenerateAllSolution.ps1 @@ -38,11 +38,11 @@ Date: April 27, 2022 #> Param ( - [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] + [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] [Alias("mt")] [string[]]$MultiTargets = @('uwp', 'wasm', 'wasdk'), - [ValidateSet('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] + [ValidateSet('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] [string[]]$ExcludeMultiTargets = @(), # default settings [Alias("c")] @@ -59,7 +59,7 @@ Param ( ) if ($MultiTargets.Contains('all')) { - $MultiTargets = @('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard') + $MultiTargets = @('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard') } if ($null -eq $ExcludeMultiTargets) @@ -67,15 +67,18 @@ if ($null -eq $ExcludeMultiTargets) $ExcludeMultiTargets = @() } -# WinUI 2 only builds native UWP (Uno.UI dropped in Uno 6). -# WinUI 3 excludes UWP. Both uwp and wasdk share a targetframework and cannot be enabled at once. -if ($WinUIMajorVersion -eq 2) +# Both uwp and wasdk share a targetframework. Both cannot be enabled at once. +# If both are supplied, remove one based on WinUIMajorVersion. +if ($MultiTargets.Contains('uwp') -and $MultiTargets.Contains('wasdk')) { - $ExcludeMultiTargets = $ExcludeMultiTargets + 'wasdk' + 'wasm' + 'macos' + 'ios' + 'android' -} -else -{ - $ExcludeMultiTargets = $ExcludeMultiTargets + 'uwp' + if ($WinUIMajorVersion -eq 2) + { + $ExcludeMultiTargets = $ExcludeMultiTargets + 'wasdk' + } + else + { + $ExcludeMultiTargets = $ExcludeMultiTargets + 'uwp' + } } $MultiTargets = $MultiTargets | Where-Object { $_ -notin $ExcludeMultiTargets } diff --git a/GenerateSingleSolution.ps1 b/GenerateSingleSolution.ps1 index 606745bc..e0e73d7d 100644 --- a/GenerateSingleSolution.ps1 +++ b/GenerateSingleSolution.ps1 @@ -33,7 +33,7 @@ Date: Feb 9, 2023 #> Param ( - [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android')] + [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android')] [Alias("mt")] [string[]]$MultiTargets = @('uwp', 'wasm', 'wasdk'), @@ -98,7 +98,7 @@ if (-not (Test-Path "$componentPath/src" -PathType Container)) # ----------------- if ($MultiTargets.Contains('all')) { - $MultiTargets = @('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android') + $MultiTargets = @('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android') } if ($null -eq $ExcludeMultiTargets) @@ -106,15 +106,18 @@ if ($null -eq $ExcludeMultiTargets) $ExcludeMultiTargets = @() } -# WinUI 2 only builds native UWP (Uno.UI dropped in Uno 6). -# WinUI 3 excludes UWP. Both uwp and wasdk share a targetframework and cannot be enabled at once. -if ($WinUIMajorVersion -eq 2) +# Both uwp and wasdk share a targetframework. Both cannot be enabled at once. +# If both are supplied, remove one based on WinUIMajorVersion. +if ($MultiTargets.Contains('uwp') -and $MultiTargets.Contains('wasdk')) { - $ExcludeMultiTargets = $ExcludeMultiTargets + 'wasdk' + 'wasm' + 'macos' + 'ios' + 'android' -} -else -{ - $ExcludeMultiTargets = $ExcludeMultiTargets + 'uwp' + if ($WinUIMajorVersion -eq 2) + { + $ExcludeMultiTargets = $ExcludeMultiTargets + 'wasdk' + } + else + { + $ExcludeMultiTargets = $ExcludeMultiTargets + 'uwp' + } } $MultiTargets = $MultiTargets | Where-Object { $_ -notin $ExcludeMultiTargets } diff --git a/MultiTarget/AvailableTargetFrameworks.props b/MultiTarget/AvailableTargetFrameworks.props index 7ea4cd34..3ca0df19 100644 --- a/MultiTarget/AvailableTargetFrameworks.props +++ b/MultiTarget/AvailableTargetFrameworks.props @@ -13,13 +13,17 @@ net9.0-windows10.0.19041.0;net8.0-windows10.0.19041.0; net9.0; - + net9.0; + net9.0; + net9.0-android; net9.0-maccatalyst; net9.0-ios; + net9.0; net9.0; + net9.0; netstandard2.0; diff --git a/MultiTarget/Defaults.props b/MultiTarget/Defaults.props index 20665cb2..86e5e82f 100644 --- a/MultiTarget/Defaults.props +++ b/MultiTarget/Defaults.props @@ -1,5 +1,5 @@ - uwp;wasdk;wasm;macos;ios;android; + uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; \ No newline at end of file diff --git a/MultiTarget/DefinedConstants.props b/MultiTarget/DefinedConstants.props index 37f46b79..b5c8c2c9 100644 --- a/MultiTarget/DefinedConstants.props +++ b/MultiTarget/DefinedConstants.props @@ -12,6 +12,9 @@ $(DefineConstants);__ANDROID__; $(DefineConstants);__IOS__; $(DefineConstants);__MACOS__; + $(DefineConstants);HAS_UNO_SKIA;__SKIA__;WINDOWS_WPF; + $(DefineConstants);HAS_UNO_SKIA;__SKIA__;__GTK__; + $(DefineConstants);NET9_0_OR_GREATER $(DefineConstants);NET8_0_OR_GREATER $(DefineConstants);NET7_0_OR_GREATER diff --git a/MultiTarget/EnabledTargetFrameworks.props b/MultiTarget/EnabledTargetFrameworks.props index ca4bb1ec..6f1c0ab9 100644 --- a/MultiTarget/EnabledTargetFrameworks.props +++ b/MultiTarget/EnabledTargetFrameworks.props @@ -10,11 +10,11 @@ $(TargetFrameworks);$(WinAppSdkTargetFrameworks) - true - true + true + true $(TargetFrameworks);$(DotnetCommonTargetFramework) $(TargetFrameworks);$(MacOSLibTargetFrameworks) diff --git a/MultiTarget/Filter-Supported-Components.ps1 b/MultiTarget/Filter-Supported-Components.ps1 index db01e964..bc187e85 100644 --- a/MultiTarget/Filter-Supported-Components.ps1 +++ b/MultiTarget/Filter-Supported-Components.ps1 @@ -17,7 +17,7 @@ Date: 6/6/2025 #> Param ( - [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] + [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] [Alias("mt")] [Parameter(Mandatory=$true)] [string[]]$MultiTargets, @@ -32,7 +32,7 @@ Param ( ) if ($MultiTargets -eq 'all') { - $MultiTargets = @('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard') + $MultiTargets = @('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard') } $supportedComponents = @(); diff --git a/MultiTarget/GenerateAllProjectReferences.ps1 b/MultiTarget/GenerateAllProjectReferences.ps1 index 43d4f262..62ca3b02 100644 --- a/MultiTarget/GenerateAllProjectReferences.ps1 +++ b/MultiTarget/GenerateAllProjectReferences.ps1 @@ -4,8 +4,8 @@ Param ( [Parameter(HelpMessage = "Only projects that support these targets will have references generated for use by deployable heads.")] [Alias("mt")] - [ValidateSet('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] - [string[]]$MultiTargets = @("uwp", "wasdk", "wasm", "macos", "ios", "android", "netstandard"), + [ValidateSet('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] + [string[]]$MultiTargets = @("uwp", "wasdk", "wpf", "wasm", "linuxgtk", "macos", "ios", "android", "netstandard"), [Parameter(HelpMessage = "The names of the components to generate references for. Defaults to all components.")] [string[]]$Components = @("all"), diff --git a/MultiTarget/GenerateMultiTargetAwareProjectReferenceProps.ps1 b/MultiTarget/GenerateMultiTargetAwareProjectReferenceProps.ps1 index a7b2849f..dbbd6728 100644 --- a/MultiTarget/GenerateMultiTargetAwareProjectReferenceProps.ps1 +++ b/MultiTarget/GenerateMultiTargetAwareProjectReferenceProps.ps1 @@ -15,9 +15,9 @@ Param ( [string]$projectRootPlaceholder = "[ProjectRoot]", [Parameter(HelpMessage = "Only projects that support these targets will have references generated for use by deployable heads.")] - [ValidateSet("uwp", "wasdk", "wasm", "macos", "ios", "android", "netstandard")] + [ValidateSet("uwp", "wasdk", "wpf", "wasm", "linuxgtk", "macos", "ios", "android", "netstandard")] [Alias("mt")] - [string[]] $MultiTargets = @("uwp", "wasdk", "wasm", "macos", "ios", "android", "netstandard") + [string[]] $MultiTargets = @("uwp", "wasdk", "wpf", "wasm", "linuxgtk", "macos", "ios", "android", "netstandard") ) if ($projectPath.EndsWith(".projitems")) { @@ -74,7 +74,7 @@ function ShouldMultiTargetMsBuildValue([string] $target) { return $(ShouldMultiTarget $target).ToString().ToLower() } -$targeted = @("uwp", "wasdk", "wasm", "macos", "ios", "android", "netstandard").Where({ ShouldMultiTarget $_ }) +$targeted = @("uwp", "wasdk", "wpf", "wasm", "linuxgtk", "macos", "ios", "android", "netstandard").Where({ ShouldMultiTarget $_ }) if ($targeted.Count -gt 0) { Write-Host "Generating project references for $([System.IO.Path]::GetFileNameWithoutExtension($projectFileName)): $($targeted -Join ', ')" @@ -83,6 +83,8 @@ if ($targeted.Count -gt 0) { $templateContents = $templateContents -replace [regex]::escape("[CanTargetWasm]"), "'$(ShouldMultiTargetMsBuildValue "wasm")'"; $templateContents = $templateContents -replace [regex]::escape("[CanTargetUwp]"), "'$(ShouldMultiTargetMsBuildValue "uwp")'"; $templateContents = $templateContents -replace [regex]::escape("[CanTargetWasdk]"), "'$(ShouldMultiTargetMsBuildValue "wasdk")'"; +$templateContents = $templateContents -replace [regex]::escape("[CanTargetWpf]"), "'$(ShouldMultiTargetMsBuildValue "wpf")'"; +$templateContents = $templateContents -replace [regex]::escape("[CanTargetLinuxGtk]"), "'$(ShouldMultiTargetMsBuildValue "linuxgtk")'"; $templateContents = $templateContents -replace [regex]::escape("[CanTargetMacOS]"), "'$(ShouldMultiTargetMsBuildValue "macos")'"; $templateContents = $templateContents -replace [regex]::escape("[CanTargetiOS]"), "'$(ShouldMultiTargetMsBuildValue "ios")'"; $templateContents = $templateContents -replace [regex]::escape("[CanTargetDroid]"), "'$(ShouldMultiTargetMsBuildValue "android")'"; diff --git a/MultiTarget/MultiTargetAwareProjectReference.props.template b/MultiTarget/MultiTargetAwareProjectReference.props.template index 5d3bb133..86b3c4d8 100644 --- a/MultiTarget/MultiTargetAwareProjectReference.props.template +++ b/MultiTarget/MultiTargetAwareProjectReference.props.template @@ -10,6 +10,8 @@ true + true + true true true true @@ -27,6 +29,14 @@ true true + true + true + true + + true + true + true + true true @@ -37,7 +47,7 @@ true true - true + true + 5.5.87 + + 6.4.229 + + $(UnoUIPackageVersion) + $(UnoWinUIPackageVersion) - + + + + + + + + true - + + + + + + + + + + + + + + + + + + + + + $(NoWarn);NU1701; + + + + + + + diff --git a/MultiTarget/Test-Component-Support.ps1 b/MultiTarget/Test-Component-Support.ps1 index 7dd2da2c..e81e82a1 100644 --- a/MultiTarget/Test-Component-Support.ps1 +++ b/MultiTarget/Test-Component-Support.ps1 @@ -32,11 +32,11 @@ Date: 6/6/2025 #> Param ( - [ValidateSet('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] + [ValidateSet('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] [Alias("smt")] [string[]]$SupportedMultiTargets, - [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] + [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] [Alias("rmt")] [Parameter(Mandatory=$true)] [string[]]$RequestedMultiTargets, @@ -51,14 +51,14 @@ Param ( ) if ($RequestedMultiTargets -eq 'all') { - $RequestedMultiTargets = @('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard') + $RequestedMultiTargets = @('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard') } # List of WinUI-0 (non-WinUI) compatible multitargets $WinUI0MultiTargets = @('netstandard') -# List of WinUI-2 compatible multitargets (native UWP only, Uno.UI dropped) -$WinUI2MultiTargets = @('uwp') +# List of WinUI-2 compatible multitargets +$WinUI2MultiTargets = @('uwp', 'wasm', 'wpf', 'linuxgtk', 'macos', 'ios', 'android') # List of WinUI-3 compatible multitargets $WinUI3MultiTargets = @('wasdk', 'wasm', 'macos', 'ios', 'android') diff --git a/MultiTarget/UseTargetFrameworks.ps1 b/MultiTarget/UseTargetFrameworks.ps1 index e6c9d006..1fa00ae4 100644 --- a/MultiTarget/UseTargetFrameworks.ps1 +++ b/MultiTarget/UseTargetFrameworks.ps1 @@ -22,19 +22,19 @@ #> Param ( [Parameter(HelpMessage = "The target frameworks to enable.")] - [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] + [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] [Alias("mt")] [string[]]$MultiTargets = @('uwp', 'wasdk', 'wasm'), # default settings [Parameter(HelpMessage = "The target frameworks to disable.")] - [ValidateSet('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard')] + [ValidateSet('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')] [string[]]$ExcludeMultiTargets = @() # default settings ) $fileContents = Get-Content -Path $PSScriptRoot/EnabledMultiTargets.props $newFileContents = $fileContents; -$AllMultiTargets = @('wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android', 'netstandard') +$AllMultiTargets = @('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard') # Exclude as needed foreach ($excluded in $ExcludeMultiTargets) { diff --git a/ProjectHeads/App.Head.Uno.UI.Dependencies.props b/ProjectHeads/App.Head.Uno.UI.Dependencies.props new file mode 100644 index 00000000..49fe326c --- /dev/null +++ b/ProjectHeads/App.Head.Uno.UI.Dependencies.props @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ProjectHeads/App.Head.Uno.props b/ProjectHeads/App.Head.Uno.props index 618faaa3..7ff16c8f 100644 --- a/ProjectHeads/App.Head.Uno.props +++ b/ProjectHeads/App.Head.Uno.props @@ -23,6 +23,11 @@ $(NoWarn);Uno0006 - - + + + diff --git a/ProjectHeads/App.Head.Wasm.props b/ProjectHeads/App.Head.Wasm.props index 7c8c4f1b..f931976a 100644 --- a/ProjectHeads/App.Head.Wasm.props +++ b/ProjectHeads/App.Head.Wasm.props @@ -79,7 +79,7 @@ - + diff --git a/ProjectHeads/GenerateSingleSampleHeads.ps1 b/ProjectHeads/GenerateSingleSampleHeads.ps1 index 15adecd8..0bbee407 100644 --- a/ProjectHeads/GenerateSingleSampleHeads.ps1 +++ b/ProjectHeads/GenerateSingleSampleHeads.ps1 @@ -30,7 +30,7 @@ Date: Feb 9, 2023 #> Param ( - [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'macos', 'ios', 'android')] + [ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android')] [Alias("mt")] [string[]]$MultiTargets = @('uwp', 'wasm', 'wasdk'), diff --git a/ProjectTemplate/src/MultiTarget.props b/ProjectTemplate/src/MultiTarget.props index caab2d42..b11c1942 100644 --- a/ProjectTemplate/src/MultiTarget.props +++ b/ProjectTemplate/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wasm;macos;ios;android; + uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; \ No newline at end of file From e213dce0c9919243fe93b726fad20f03b10fcb6c Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Fri, 20 Feb 2026 09:48:40 +0100 Subject: [PATCH 05/25] Adjustments --- MultiTarget/PackageReferences/Uno.props | 20 +++++++++----------- MultiTarget/Test-Component-Support.ps1 | 2 +- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/MultiTarget/PackageReferences/Uno.props b/MultiTarget/PackageReferences/Uno.props index 4ea6b13f..37b157f6 100644 --- a/MultiTarget/PackageReferences/Uno.props +++ b/MultiTarget/PackageReferences/Uno.props @@ -10,16 +10,16 @@ - - - - + + + + @@ -36,15 +36,13 @@ - - - - + + + - - - + + diff --git a/MultiTarget/Test-Component-Support.ps1 b/MultiTarget/Test-Component-Support.ps1 index e81e82a1..3b5d068f 100644 --- a/MultiTarget/Test-Component-Support.ps1 +++ b/MultiTarget/Test-Component-Support.ps1 @@ -61,7 +61,7 @@ $WinUI0MultiTargets = @('netstandard') $WinUI2MultiTargets = @('uwp', 'wasm', 'wpf', 'linuxgtk', 'macos', 'ios', 'android') # List of WinUI-3 compatible multitargets -$WinUI3MultiTargets = @('wasdk', 'wasm', 'macos', 'ios', 'android') +$WinUI3MultiTargets = @('wasdk', 'wasm', 'ios', 'android') # If WinUI 0 is requested, the component must not support WinUI 2 or WinUI 3 to be built. # If WinUI 2 or 3 is requested, the component must have a target that supports WinUI 2 or 3 to be built. From 54afbc36b0b267514f5ad1ad3ec11c6c25bbbf4f Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Fri, 20 Feb 2026 09:52:46 +0100 Subject: [PATCH 06/25] Undo change --- MultiTarget/UseUnoWinUI.ps1 | 2 ++ ProjectHeads/App.Head.Uno.props | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/MultiTarget/UseUnoWinUI.ps1 b/MultiTarget/UseUnoWinUI.ps1 index 72a36baf..7b419a43 100644 --- a/MultiTarget/UseUnoWinUI.ps1 +++ b/MultiTarget/UseUnoWinUI.ps1 @@ -11,12 +11,14 @@ function ApplyWinUISwap([string] $filePath) { $fileContents = $fileContents -replace '2', '3'; $fileContents = $fileContents -replace 'Uwp', 'WinUI'; $fileContents = $fileContents -replace 'Uwp', 'WinUI'; + $fileContents = $fileContents -replace 'Uno.UI', 'Uno.WinUI'; } if ($winUIMajorVersion -eq "2") { $fileContents = $fileContents -replace '3', '2'; $fileContents = $fileContents -replace 'WinUI', 'Uwp'; $fileContents = $fileContents -replace 'WinUI', 'Uwp'; + $fileContents = $fileContents -replace 'Uno.WinUI', 'Uno.UI'; } Set-Content -Force -Path $filePath -Value $fileContents; diff --git a/ProjectHeads/App.Head.Uno.props b/ProjectHeads/App.Head.Uno.props index 7ff16c8f..900312c4 100644 --- a/ProjectHeads/App.Head.Uno.props +++ b/ProjectHeads/App.Head.Uno.props @@ -28,6 +28,5 @@ This import must be inside THIS file to allow swapping between Uno.UI and Uno.WinUI via pwsh. Changes to this file are suppressed by git when switching to avoid changing the default for all users. --> - - + From 0cbae2498faa5567ffd8e048e1ffff87d87a0037 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Mon, 16 Mar 2026 16:53:59 +0100 Subject: [PATCH 07/25] fix: Ensure WASM head can start up --- ProjectHeads/App.Head.Wasm.props | 1 + 1 file changed, 1 insertion(+) diff --git a/ProjectHeads/App.Head.Wasm.props b/ProjectHeads/App.Head.Wasm.props index f931976a..32487037 100644 --- a/ProjectHeads/App.Head.Wasm.props +++ b/ProjectHeads/App.Head.Wasm.props @@ -2,6 +2,7 @@ Exe $(WasmHeadTargetFramework.Split(';')[0]) + false + true + true + true + true + 3 + true + WinUI + + $(DefineConstants);WINUI3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SourceAssets/%(RecursiveDir)%(FileName)%(Extension) + + + SourceAssets/%(RecursiveDir)%(FileName)%(Extension) + + + SourceAssets/%(RecursiveDir)%(FileName)%(Extension).dat + + + + + + $(NoWarn);IL2026;Uno0006 + + diff --git a/ProjectHeads/AllComponents/Uno/Platforms/Android/AndroidManifest.xml b/ProjectHeads/AllComponents/Uno/Platforms/Android/AndroidManifest.xml new file mode 100644 index 00000000..24ee4aea --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Platforms/Android/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ProjectHeads/AllComponents/Uno/Platforms/Android/Assets/AboutAssets.txt b/ProjectHeads/AllComponents/Uno/Platforms/Android/Assets/AboutAssets.txt new file mode 100644 index 00000000..6b8fc66e --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Platforms/Android/Assets/AboutAssets.txt @@ -0,0 +1,5 @@ +Any raw assets you want to be deployed with your application can be placed in this +directory (and child directories). Deployment of the asset to your application is done +using the IDE or by using the following MSBuild property in your .csproj: + + diff --git a/ProjectHeads/AllComponents/Uno/Platforms/Android/Main.Android.cs b/ProjectHeads/AllComponents/Uno/Platforms/Android/Main.Android.cs new file mode 100644 index 00000000..18ea8687 --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Platforms/Android/Main.Android.cs @@ -0,0 +1,19 @@ +using Android.App; +using Android.Runtime; + +namespace CommunityToolkit.App.Uno; + +[global::Android.App.ApplicationAttribute( + Label = "@string/ApplicationName", + Icon = "@mipmap/iconapp", + LargeHeap = true, + HardwareAccelerated = true, + Theme = "@style/AppTheme" +)] +public class Application : Microsoft.UI.Xaml.NativeApplication +{ + public Application(IntPtr javaReference, JniHandleOwnership transfer) + : base(() => new CommunityToolkit.App.Shared.App(), javaReference, transfer) + { + } +} diff --git a/ProjectHeads/AllComponents/Uno/Platforms/Android/MainActivity.Android.cs b/ProjectHeads/AllComponents/Uno/Platforms/Android/MainActivity.Android.cs new file mode 100644 index 00000000..c0164819 --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Platforms/Android/MainActivity.Android.cs @@ -0,0 +1,16 @@ +using Android.App; +using Android.Content.PM; +using Android.OS; +using Android.Views; +using Android.Widget; + +namespace CommunityToolkit.App.Uno; + +[Activity( + MainLauncher = true, + ConfigurationChanges = global::Uno.UI.ActivityHelper.AllConfigChanges, + WindowSoftInputMode = SoftInput.AdjustNothing | SoftInput.StateHidden +)] +public class MainActivity : Microsoft.UI.Xaml.ApplicationActivity +{ +} diff --git a/ProjectHeads/AllComponents/Uno/Platforms/Android/Resources/values/Strings.xml b/ProjectHeads/AllComponents/Uno/Platforms/Android/Resources/values/Strings.xml new file mode 100644 index 00000000..ee06a129 --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Platforms/Android/Resources/values/Strings.xml @@ -0,0 +1,4 @@ + + + CommunityToolkit + diff --git a/ProjectHeads/AllComponents/Uno/Platforms/Android/Resources/values/Styles.xml b/ProjectHeads/AllComponents/Uno/Platforms/Android/Resources/values/Styles.xml new file mode 100644 index 00000000..2c3bf24a --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Platforms/Android/Resources/values/Styles.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/ProjectHeads/AllComponents/Uno/Platforms/Android/environment.conf b/ProjectHeads/AllComponents/Uno/Platforms/Android/environment.conf new file mode 100644 index 00000000..9d9709a9 --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Platforms/Android/environment.conf @@ -0,0 +1,2 @@ +## Mono GC tuning params +MONO_GC_PARAMS=soft-heap-limit=512m,nursery-size=64m,evacuation-threshold=66,major=marksweep,concurrent-sweep diff --git a/ProjectHeads/AllComponents/Uno/Platforms/Desktop/Program.cs b/ProjectHeads/AllComponents/Uno/Platforms/Desktop/Program.cs new file mode 100644 index 00000000..031d0325 --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Platforms/Desktop/Program.cs @@ -0,0 +1,19 @@ +using Uno.UI.Hosting; +using CommunityToolkit.App.Shared; + +internal class Program +{ + [STAThread] + public static void Main(string[] args) + { + var host = UnoPlatformHostBuilder.Create() + .App(() => new App()) + .UseX11() + .UseLinuxFrameBuffer() + .UseMacOS() + .UseWin32() + .Build(); + + host.Run(); + } +} diff --git a/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/LinkerConfig.xml b/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/LinkerConfig.xml new file mode 100644 index 00000000..cc3e5cdd --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/LinkerConfig.xml @@ -0,0 +1,3 @@ + + + diff --git a/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/Program.cs b/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/Program.cs new file mode 100644 index 00000000..d1707888 --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/Program.cs @@ -0,0 +1,15 @@ +using Uno.UI.Hosting; +using CommunityToolkit.App.Shared; + +public class Program +{ + public static async Task Main(string[] args) + { + var host = UnoPlatformHostBuilder.Create() + .App(() => new App()) + .UseWebAssembly() + .Build(); + + await host.RunAsync(); + } +} diff --git a/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/WasmScripts/AppManifest.js b/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/WasmScripts/AppManifest.js new file mode 100644 index 00000000..8018667f --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/WasmScripts/AppManifest.js @@ -0,0 +1,3 @@ +var UnoAppManifest = { + displayName: "CommunityToolkit" +} diff --git a/ProjectHeads/AllComponents/Uno/Platforms/iOS/Entitlements.plist b/ProjectHeads/AllComponents/Uno/Platforms/iOS/Entitlements.plist new file mode 100644 index 00000000..6631ffa6 --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Platforms/iOS/Entitlements.plist @@ -0,0 +1,6 @@ + + + + + + diff --git a/ProjectHeads/AllComponents/Uno/Platforms/iOS/Info.plist b/ProjectHeads/AllComponents/Uno/Platforms/iOS/Info.plist new file mode 100644 index 00000000..8f81dd88 --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Platforms/iOS/Info.plist @@ -0,0 +1,43 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + + CFBundleIdentifier + com.companyname.CommunityToolkit + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + CommunityToolkit + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + MinimumOSVersion + 16.0 + UIDeviceFamily + + 1 + 2 + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ProjectHeads/AllComponents/Uno/Platforms/iOS/Main.iOS.cs b/ProjectHeads/AllComponents/Uno/Platforms/iOS/Main.iOS.cs new file mode 100644 index 00000000..2acc5ec3 --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Platforms/iOS/Main.iOS.cs @@ -0,0 +1,17 @@ +using Uno.UI.Hosting; +using CommunityToolkit.App.Shared; + +namespace CommunityToolkit.App.Uno; + +public class EntryPoint +{ + public static void Main(string[] args) + { + var host = UnoPlatformHostBuilder.Create() + .App(() => new App()) + .UseAppleUIKit() + .Build(); + + host.Run(); + } +} diff --git a/ProjectHeads/AllComponents/Uno/Platforms/iOS/Media.xcassets/LaunchImages.launchimage/Contents.json b/ProjectHeads/AllComponents/Uno/Platforms/iOS/Media.xcassets/LaunchImages.launchimage/Contents.json new file mode 100644 index 00000000..4103a707 --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Platforms/iOS/Media.xcassets/LaunchImages.launchimage/Contents.json @@ -0,0 +1,20 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x" + }, + { + "idiom": "universal", + "scale": "2x" + }, + { + "idiom": "universal", + "scale": "3x" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +} diff --git a/ProjectHeads/AllComponents/Uno/Platforms/iOS/PrivacyInfo.xcprivacy b/ProjectHeads/AllComponents/Uno/Platforms/iOS/PrivacyInfo.xcprivacy new file mode 100644 index 00000000..1d00d2f5 --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Platforms/iOS/PrivacyInfo.xcprivacy @@ -0,0 +1,31 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyCollectedDataTypes + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + + diff --git a/ProjectHeads/GenerateSingleSampleHeads.ps1 b/ProjectHeads/GenerateSingleSampleHeads.ps1 index 0bbee407..b11fffb4 100644 --- a/ProjectHeads/GenerateSingleSampleHeads.ps1 +++ b/ProjectHeads/GenerateSingleSampleHeads.ps1 @@ -43,9 +43,11 @@ Param ( [string]$componentPath, [Parameter(HelpMessage = "Add extra diagnostic output to slngen generator.")] - [switch]$UseDiagnostics = $false + [switch]$UseDiagnostics = $false, + + [switch]$IncludeUnoSdkHead = $false ) # Use & and a separate script path variable to avoid issues with parameter passing $scriptPath = "$PSScriptRoot/../GenerateSingleSolution.ps1" -& $scriptPath -MultiTargets $MultiTargets -ExcludeMultiTargets $ExcludeMultiTargets -WinUIMajorVersion $WinUIMajorVersion -UseDiagnostics:$UseDiagnostics -componentPath $componentPath \ No newline at end of file +& $scriptPath -MultiTargets $MultiTargets -ExcludeMultiTargets $ExcludeMultiTargets -WinUIMajorVersion $WinUIMajorVersion -UseDiagnostics:$UseDiagnostics -IncludeUnoSdkHead:$IncludeUnoSdkHead -componentPath $componentPath \ No newline at end of file diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/Android/AndroidManifest.xml b/ProjectHeads/SingleComponent/Uno/Platforms/Android/AndroidManifest.xml new file mode 100644 index 00000000..24ee4aea --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Platforms/Android/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/Android/Assets/AboutAssets.txt b/ProjectHeads/SingleComponent/Uno/Platforms/Android/Assets/AboutAssets.txt new file mode 100644 index 00000000..6b8fc66e --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Platforms/Android/Assets/AboutAssets.txt @@ -0,0 +1,5 @@ +Any raw assets you want to be deployed with your application can be placed in this +directory (and child directories). Deployment of the asset to your application is done +using the IDE or by using the following MSBuild property in your .csproj: + + diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/Android/Main.Android.cs b/ProjectHeads/SingleComponent/Uno/Platforms/Android/Main.Android.cs new file mode 100644 index 00000000..18ea8687 --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Platforms/Android/Main.Android.cs @@ -0,0 +1,19 @@ +using Android.App; +using Android.Runtime; + +namespace CommunityToolkit.App.Uno; + +[global::Android.App.ApplicationAttribute( + Label = "@string/ApplicationName", + Icon = "@mipmap/iconapp", + LargeHeap = true, + HardwareAccelerated = true, + Theme = "@style/AppTheme" +)] +public class Application : Microsoft.UI.Xaml.NativeApplication +{ + public Application(IntPtr javaReference, JniHandleOwnership transfer) + : base(() => new CommunityToolkit.App.Shared.App(), javaReference, transfer) + { + } +} diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/Android/MainActivity.Android.cs b/ProjectHeads/SingleComponent/Uno/Platforms/Android/MainActivity.Android.cs new file mode 100644 index 00000000..c0164819 --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Platforms/Android/MainActivity.Android.cs @@ -0,0 +1,16 @@ +using Android.App; +using Android.Content.PM; +using Android.OS; +using Android.Views; +using Android.Widget; + +namespace CommunityToolkit.App.Uno; + +[Activity( + MainLauncher = true, + ConfigurationChanges = global::Uno.UI.ActivityHelper.AllConfigChanges, + WindowSoftInputMode = SoftInput.AdjustNothing | SoftInput.StateHidden +)] +public class MainActivity : Microsoft.UI.Xaml.ApplicationActivity +{ +} diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/Android/Resources/values/Strings.xml b/ProjectHeads/SingleComponent/Uno/Platforms/Android/Resources/values/Strings.xml new file mode 100644 index 00000000..ee06a129 --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Platforms/Android/Resources/values/Strings.xml @@ -0,0 +1,4 @@ + + + CommunityToolkit + diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/Android/Resources/values/Styles.xml b/ProjectHeads/SingleComponent/Uno/Platforms/Android/Resources/values/Styles.xml new file mode 100644 index 00000000..2c3bf24a --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Platforms/Android/Resources/values/Styles.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/Android/environment.conf b/ProjectHeads/SingleComponent/Uno/Platforms/Android/environment.conf new file mode 100644 index 00000000..9d9709a9 --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Platforms/Android/environment.conf @@ -0,0 +1,2 @@ +## Mono GC tuning params +MONO_GC_PARAMS=soft-heap-limit=512m,nursery-size=64m,evacuation-threshold=66,major=marksweep,concurrent-sweep diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/Desktop/Program.cs b/ProjectHeads/SingleComponent/Uno/Platforms/Desktop/Program.cs new file mode 100644 index 00000000..031d0325 --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Platforms/Desktop/Program.cs @@ -0,0 +1,19 @@ +using Uno.UI.Hosting; +using CommunityToolkit.App.Shared; + +internal class Program +{ + [STAThread] + public static void Main(string[] args) + { + var host = UnoPlatformHostBuilder.Create() + .App(() => new App()) + .UseX11() + .UseLinuxFrameBuffer() + .UseMacOS() + .UseWin32() + .Build(); + + host.Run(); + } +} diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/LinkerConfig.xml b/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/LinkerConfig.xml new file mode 100644 index 00000000..cc3e5cdd --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/LinkerConfig.xml @@ -0,0 +1,3 @@ + + + diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/Program.cs b/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/Program.cs new file mode 100644 index 00000000..d1707888 --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/Program.cs @@ -0,0 +1,15 @@ +using Uno.UI.Hosting; +using CommunityToolkit.App.Shared; + +public class Program +{ + public static async Task Main(string[] args) + { + var host = UnoPlatformHostBuilder.Create() + .App(() => new App()) + .UseWebAssembly() + .Build(); + + await host.RunAsync(); + } +} diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/WasmScripts/AppManifest.js b/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/WasmScripts/AppManifest.js new file mode 100644 index 00000000..8018667f --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/WasmScripts/AppManifest.js @@ -0,0 +1,3 @@ +var UnoAppManifest = { + displayName: "CommunityToolkit" +} diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Entitlements.plist b/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Entitlements.plist new file mode 100644 index 00000000..6631ffa6 --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Entitlements.plist @@ -0,0 +1,6 @@ + + + + + + diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Info.plist b/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Info.plist new file mode 100644 index 00000000..8f81dd88 --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Info.plist @@ -0,0 +1,43 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + + CFBundleIdentifier + com.companyname.CommunityToolkit + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + CommunityToolkit + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + MinimumOSVersion + 16.0 + UIDeviceFamily + + 1 + 2 + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Main.iOS.cs b/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Main.iOS.cs new file mode 100644 index 00000000..2acc5ec3 --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Main.iOS.cs @@ -0,0 +1,17 @@ +using Uno.UI.Hosting; +using CommunityToolkit.App.Shared; + +namespace CommunityToolkit.App.Uno; + +public class EntryPoint +{ + public static void Main(string[] args) + { + var host = UnoPlatformHostBuilder.Create() + .App(() => new App()) + .UseAppleUIKit() + .Build(); + + host.Run(); + } +} diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Media.xcassets/LaunchImages.launchimage/Contents.json b/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Media.xcassets/LaunchImages.launchimage/Contents.json new file mode 100644 index 00000000..4103a707 --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Media.xcassets/LaunchImages.launchimage/Contents.json @@ -0,0 +1,20 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x" + }, + { + "idiom": "universal", + "scale": "2x" + }, + { + "idiom": "universal", + "scale": "3x" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +} diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/iOS/PrivacyInfo.xcprivacy b/ProjectHeads/SingleComponent/Uno/Platforms/iOS/PrivacyInfo.xcprivacy new file mode 100644 index 00000000..1d00d2f5 --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Platforms/iOS/PrivacyInfo.xcprivacy @@ -0,0 +1,31 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyCollectedDataTypes + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + + diff --git a/ProjectHeads/SingleComponent/Uno/ProjectTemplate.Uno.csproj b/ProjectHeads/SingleComponent/Uno/ProjectTemplate.Uno.csproj new file mode 100644 index 00000000..aba78b06 --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/ProjectTemplate.Uno.csproj @@ -0,0 +1,85 @@ + + + Exe + net9.0-desktop;net9.0-browserwasm;net9.0-android;net9.0-ios + + + SkiaRenderer; + + + false + + + true + true + true + true + 3 + true + WinUI + + $(DefineConstants);WINUI3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SourceAssets/%(RecursiveDir)%(FileName)%(Extension).dat + + + + + + + $(NoWarn);IL2026;Uno0006 + + From 8503cf344a1cc2a21a8cd463b853c6b7e8ba0155 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Tue, 24 Feb 2026 14:56:09 +0100 Subject: [PATCH 10/25] Adjust scripts and workflows ^ Conflicts: ^ .github/workflows/build.yml --- .github/workflows/build.yml | 69 +++++++++++++++++++++++++++++----- GenerateAllSolution.ps1 | 20 +++++++++- GenerateSingleSolution.ps1 | 20 +++++++++- GenerateVSCodeLaunchConfig.ps1 | 33 +++++++++++++++- MultiTarget/UseUnoWinUI.ps1 | 3 -- global.json | 5 ++- 6 files changed, 131 insertions(+), 19 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2049b492..570f48a4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -112,6 +112,9 @@ jobs: with: global-json-file: tooling/global.json + - name: Install .NET workloads + run: dotnet workload install wasm-tools + - name: .NET Info (if diagnostics) if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }} run: dotnet --info @@ -119,14 +122,16 @@ jobs: - name: Copy props files to root shell: pwsh working-directory: ./ - run: copy ./tooling/.github/workflows/config/* ./ + run: | + copy ./tooling/.github/workflows/config/* ./ + copy ./tooling/global.json ./ - name: Add msbuild to PATH uses: microsoft/setup-msbuild@v2 - name: Add project heads to ProjectTemplate working-directory: ./${{ env.PROJECT_DIRECTORY }} - run: ${{ github.workspace }}/${{ env.HEADS_DIRECTORY }}/GenerateSingleSampleHeads.ps1 -componentPath ${{ github.workspace }}/${{ env.PROJECT_DIRECTORY }}${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} + run: ${{ github.workspace }}/${{ env.HEADS_DIRECTORY }}/GenerateSingleSampleHeads.ps1 -IncludeUnoSdkHead -componentPath ${{ github.workspace }}/${{ env.PROJECT_DIRECTORY }}${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} # Build and use template for creating new experiments - name: Build ProjectTemplate @@ -178,6 +183,10 @@ jobs: with: global-json-file: tooling/global.json + - name: Install .NET workloads + if: ${{ matrix.multitarget == 'wasm' }} + run: dotnet workload install wasm-tools + - name: .NET Info (if diagnostics) if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }} run: dotnet --info @@ -187,6 +196,7 @@ jobs: working-directory: ./ run: | copy ./tooling/.github/workflows/config/* ./ + copy ./tooling/global.json ./ mkdir ./.config copy ./tooling/.config/dotnet-tools.json ./.config/dotnet-tools.json mkdir ./components @@ -214,12 +224,29 @@ jobs: - name: Add project heads to ${{ env.TEST_PROJECT_NAME }} working-directory: ./${{ env.TEST_PROJECT_DIRECTORY }} - run: ${{ github.workspace }}/${{ env.HEADS_DIRECTORY }}/GenerateSingleSampleHeads.ps1 -MultiTargets ${{ matrix.multitarget }} -winui ${{ matrix.winui }} -componentPath "${{ github.workspace }}/${{ env.TEST_PROJECT_DIRECTORY }}"${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} + run: >- + ${{ github.workspace }}/${{ env.HEADS_DIRECTORY }}/GenerateSingleSampleHeads.ps1 + -MultiTargets ${{ matrix.multitarget }} + -winui ${{ matrix.winui }} + -componentPath "${{ github.workspace }}/${{ env.TEST_PROJECT_DIRECTORY }}" + ${{ matrix.multitarget == 'wasm' && matrix.winui == 3 && ' -IncludeUnoSdkHead' || '' }} + ${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} - name: MSBuild + if: ${{ matrix.multitarget != 'wasm' || matrix.winui == 2 }} working-directory: ./${{ env.TEST_PROJECT_DIRECTORY }} run: msbuild.exe ${{ env.TEST_PROJECT_NAME }}.sln /restore /nowarn:MSB4011 -p:Configuration=Release /m ${{ env.ENABLE_DIAGNOSTICS == 'true' && '/bl' || '' }} /v:${{ env.MSBUILD_VERBOSITY }} + - name: Build Uno head (browserwasm) + if: ${{ matrix.multitarget == 'wasm' && matrix.winui == 3 }} + working-directory: ./${{ env.TEST_PROJECT_DIRECTORY }} + run: dotnet build heads/Uno/${{ env.TEST_PROJECT_NAME }}.Uno.csproj -f net9.0-browserwasm -p:Configuration=Release + + - name: Build Uno head (desktop) + if: ${{ matrix.multitarget == 'wasm' && matrix.winui == 3 }} + working-directory: ./${{ env.TEST_PROJECT_DIRECTORY }} + run: dotnet build heads/Uno/${{ env.TEST_PROJECT_NAME }}.Uno.csproj -f net9.0-desktop -p:Configuration=Release + # Run tests - name: Setup VSTest Path uses: darenm/setup-vstest@3a16d909a1f3bbc65b52f8270d475d905e7d3e44 @@ -246,10 +273,11 @@ jobs: name: new-experiment-logs-${{ matrix.multitarget }}-winui${{ matrix.winui }} path: ./**/*.*log - wasm-linux: - runs-on: ubuntu-latest + uno-linux: + runs-on: windows-2022 env: HEADS_DIRECTORY: tooling/ProjectHeads + PROJECT_DIRECTORY: tooling/ProjectTemplate TEST_PROJECT_NAME: CiTestExp steps: @@ -264,6 +292,9 @@ jobs: with: global-json-file: tooling/global.json + - name: Install .NET workloads + run: dotnet workload install android ios maui wasm-tools + - name: .NET Info (if diagnostics) if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }} run: dotnet --info @@ -273,10 +304,14 @@ jobs: working-directory: ./ run: | copy ./tooling/.github/workflows/config/* ./ + copy ./tooling/global.json ./ mkdir ./.config copy ./tooling/.config/dotnet-tools.json ./.config/dotnet-tools.json mkdir ./components + - name: Add msbuild to PATH + uses: microsoft/setup-msbuild@v2 + # Restore Tools from Manifest list in the Repository - name: Restore dotnet tools working-directory: ./ @@ -294,20 +329,36 @@ jobs: - name: Generate solution shell: pwsh working-directory: ./ - run: ./tooling/GenerateAllSolution.ps1${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} -MultiTargets wasm + run: ./tooling/GenerateAllSolution.ps1 -IncludeUnoSdkHead${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} -MultiTargets wasm - name: dotnet build shell: pwsh working-directory: ./ run: ./tooling/Build-Toolkit-Components.ps1 -Release -MultiTargets wasm ${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -BinlogOutput ./ -EnableBinLogs' || '' }} - - # TODO: Do we want to run tests here? Can we do that on linux easily? + + - name: Build Uno head (browserwasm) + shell: pwsh + working-directory: ./ + run: >- + dotnet build + tooling/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj + -f net9.0-browserwasm + -p:Configuration=Release + + - name: Build Uno head (desktop) + shell: pwsh + working-directory: ./ + run: >- + dotnet build + tooling/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj + -f net9.0-desktop + -p:Configuration=Release - name: Artifact - Diagnostic Logs uses: actions/upload-artifact@v4 if: ${{ (env.ENABLE_DIAGNOSTICS == 'true' || env.COREHOST_TRACE != '') && always() }} with: - name: linux-logs + name: uno-linux-logs path: ./**/*.*log diff --git a/GenerateAllSolution.ps1 b/GenerateAllSolution.ps1 index 72eb9bac..8e77d2b7 100644 --- a/GenerateAllSolution.ps1 +++ b/GenerateAllSolution.ps1 @@ -54,8 +54,10 @@ Param ( [string[]]$ExcludeComponents, [switch]$UseDiagnostics = $false, - - [bool]$Launch = $true + + [bool]$Launch = $true, + + [switch]$IncludeUnoSdkHead = $false ) if ($MultiTargets.Contains('all')) { @@ -155,6 +157,11 @@ foreach ($componentName in $Components) { # Once we have that, just do a transform on the csproj filename inside this loop to decide the same csproj for those separate MultiTargets. # === foreach ($multitarget in $allUsedMultiTargetPrefs) { + # When using Uno.Sdk head, skip the traditional Wasm head (Uno SDK covers wasm for WinUI 3) + if ($multitarget -eq 'wasm' -and $IncludeUnoSdkHead) { + continue + } + # capitalize first letter, avoid case sensitivity issues on linux $csprojFileNamePartForMultiTarget = $multitarget.substring(0,1).ToUpper() + $multitarget.Substring(1).ToLower() @@ -168,6 +175,15 @@ foreach ($multitarget in $allUsedMultiTargetPrefs) { } } +if ($IncludeUnoSdkHead) { + $unoHeadPath = "./tooling/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj" + if (Test-Path $unoHeadPath) { + [void]$projects.Add($unoHeadPath) + } else { + Write-Warning "Uno.Sdk head project not found at $unoHeadPath." + } +} + if ($UseDiagnostics.IsPresent) { $sdkoptions = "-d" diff --git a/GenerateSingleSolution.ps1 b/GenerateSingleSolution.ps1 index e0e73d7d..5d654954 100644 --- a/GenerateSingleSolution.ps1 +++ b/GenerateSingleSolution.ps1 @@ -49,7 +49,9 @@ Param ( [string]$componentPath, [Parameter(HelpMessage = "Add extra diagnostic output to slngen generator.")] - [switch]$UseDiagnostics = $false + [switch]$UseDiagnostics = $false, + + [switch]$IncludeUnoSdkHead = $false ) if ($null -ne $Env:Path -and $Env:Path.ToLower().Contains("msbuild") -eq $false) { @@ -191,6 +193,11 @@ Write-Output "Generating solution for $componentName in $generatedSolutionFilePa # TODO: this handles separate project heads, but won't directly handle the unified Skia head from Uno. # Once we have that, just do a transform on the csproj filename inside this loop to decide the same csproj for those separate MultiTargets. foreach ($multitarget in $MultiTargets) { + # When using Uno.Sdk head, skip the traditional Wasm head (Uno SDK covers wasm for WinUI 3) + if ($multitarget -eq 'wasm' -and $IncludeUnoSdkHead) { + continue + } + # capitalize first letter, avoid case sensitivity issues on linux $csprojFileNamePartForMultiTarget = $multitarget.substring(0,1).ToUpper() + $multitarget.Substring(1).ToLower() @@ -208,6 +215,17 @@ foreach ($multitarget in $MultiTargets) { } } +if ($IncludeUnoSdkHead) { + $unoHeadPath = "$outputHeadsDir\Uno\*Uno.csproj" + if (Test-Path $unoHeadPath) { + foreach ($foundItem in Get-ChildItem $unoHeadPath) { + $projects = $projects + $foundItem.FullName + } + } else { + Write-Warning "Uno.Sdk head project not found at $unoHeadPath." + } +} + # Include common dependencies required for solution to build $projects = $projects + "$PSScriptRoot\CommunityToolkit.App.Shared\**\*.*proj" $projects = $projects + "$PSScriptRoot\CommunityToolkit.Tests.Shared\**\*.*proj" diff --git a/GenerateVSCodeLaunchConfig.ps1 b/GenerateVSCodeLaunchConfig.ps1 index 58ced9ed..f8809ea2 100644 --- a/GenerateVSCodeLaunchConfig.ps1 +++ b/GenerateVSCodeLaunchConfig.ps1 @@ -9,7 +9,7 @@ function CreateVsCodeLaunchConfigJson { ) return "{ - `"name`": `"$projectName`", + `"name`": `"$projectName (Wasm)`", `"type`": `"coreclr`", `"request`": `"launch`", `"program`": `"dotnet`", @@ -29,6 +29,32 @@ function CreateVsCodeLaunchConfigJson { }"; } +function CreateUnoVsCodeLaunchConfigJson { + param ( + [string]$projectName + ) + + return "{ + `"name`": `"$projectName (Uno)`", + `"type`": `"coreclr`", + `"request`": `"launch`", + `"program`": `"dotnet`", + `"args`": [ + `"run`", + `"build`", + `"/r`", + `"/p:UnoSourceGeneratorUseGenerationHost=true`", + `"/p:UnoSourceGeneratorUseGenerationController=false`", + `"/p:UnoRemoteControlPort=443`", + `"--project=`$`{workspaceFolder`}/components/$projectName/heads/Uno/$projectName.Uno.csproj`" + ], + `"presentation`": { + `"group`": `"2`" + }, + `"cwd`": `"`$`{workspaceFolder`}/components/$projectName/heads/Uno`" + }"; +} + $launchConfigJson = Get-Content -Path "$PSScriptRoot/../.vscode/launch.json" -ErrorAction Stop; $launchConfig = $launchConfigJson | ConvertFrom-Json; @@ -46,8 +72,11 @@ foreach ($projectPath in Get-ChildItem -Directory -Depth 0 -Path "$PSScriptRoot/ $configJson = CreateVsCodeLaunchConfigJson $projectName; $config = $configJson | ConvertFrom-Json; - $launchConfig.configurations += $config; + + $unoConfigJson = CreateUnoVsCodeLaunchConfigJson $projectName; + $unoConfig = $unoConfigJson | ConvertFrom-Json; + $launchConfig.configurations += $unoConfig; } if ($allowGitChanges.IsPresent) { diff --git a/MultiTarget/UseUnoWinUI.ps1 b/MultiTarget/UseUnoWinUI.ps1 index 7b419a43..e260c3dd 100644 --- a/MultiTarget/UseUnoWinUI.ps1 +++ b/MultiTarget/UseUnoWinUI.ps1 @@ -11,14 +11,12 @@ function ApplyWinUISwap([string] $filePath) { $fileContents = $fileContents -replace '2', '3'; $fileContents = $fileContents -replace 'Uwp', 'WinUI'; $fileContents = $fileContents -replace 'Uwp', 'WinUI'; - $fileContents = $fileContents -replace 'Uno.UI', 'Uno.WinUI'; } if ($winUIMajorVersion -eq "2") { $fileContents = $fileContents -replace '3', '2'; $fileContents = $fileContents -replace 'WinUI', 'Uwp'; $fileContents = $fileContents -replace 'WinUI', 'Uwp'; - $fileContents = $fileContents -replace 'Uno.WinUI', 'Uno.UI'; } Set-Content -Force -Path $filePath -Value $fileContents; @@ -27,7 +25,6 @@ function ApplyWinUISwap([string] $filePath) { Write-Output "Switching Uno to WinUI $winUIMajorVersion"; -ApplyWinUISwap $PSScriptRoot/../ProjectHeads/App.Head.Uno.props ApplyWinUISwap $PSScriptRoot/PackageReferences/Uno.props ApplyWinUISwap $PSScriptRoot/WinUI.TargetVersion.props diff --git a/global.json b/global.json index cfa58f62..200291be 100644 --- a/global.json +++ b/global.json @@ -3,8 +3,9 @@ "version": "9.0.310", "rollForward": "latestFeature" }, - "msbuild-sdks": + "msbuild-sdks": { - "MSBuild.Sdk.Extras":"3.0.23" + "MSBuild.Sdk.Extras":"3.0.23", + "Uno.Sdk": "6.4.58" } } From f4f33e64dd3b6578ad1ea3aee82780909147fe68 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Wed, 25 Feb 2026 09:56:24 +0100 Subject: [PATCH 11/25] Adjust CI to build all Uno.Sdk targets --- .github/workflows/build.yml | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 570f48a4..80f6b60c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -146,7 +146,7 @@ jobs: fail-fast: false # prevent one matrix pipeline from being cancelled if one fails, we want them all to run to completion. matrix: winui: [2, 3] - multitarget: ['uwp', 'wasdk', 'wasm'] + multitarget: ['uwp', 'wasdk', 'wasm', 'unosdk'] exclude: # WinUI 2 not supported on wasdk - winui: 2 @@ -154,6 +154,12 @@ jobs: # WinUI 3 not supported on uwp - winui: 3 multitarget: uwp + # Uno SDK is WinUI 3 only + - winui: 2 + multitarget: unosdk + # WinUI 3 wasm is covered by the unosdk entry + - winui: 3 + multitarget: wasm env: HEADS_DIRECTORY: tooling/ProjectHeads @@ -184,8 +190,8 @@ jobs: global-json-file: tooling/global.json - name: Install .NET workloads - if: ${{ matrix.multitarget == 'wasm' }} - run: dotnet workload install wasm-tools + if: ${{ matrix.multitarget == 'wasm' || matrix.multitarget == 'unosdk' }} + run: dotnet workload install wasm-tools ${{ matrix.multitarget == 'unosdk' && 'android ios maui' || '' }} - name: .NET Info (if diagnostics) if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }} @@ -226,26 +232,21 @@ jobs: working-directory: ./${{ env.TEST_PROJECT_DIRECTORY }} run: >- ${{ github.workspace }}/${{ env.HEADS_DIRECTORY }}/GenerateSingleSampleHeads.ps1 - -MultiTargets ${{ matrix.multitarget }} + -MultiTargets ${{ matrix.multitarget == 'unosdk' && 'wasm' || matrix.multitarget }} -winui ${{ matrix.winui }} -componentPath "${{ github.workspace }}/${{ env.TEST_PROJECT_DIRECTORY }}" - ${{ matrix.multitarget == 'wasm' && matrix.winui == 3 && ' -IncludeUnoSdkHead' || '' }} + ${{ matrix.multitarget == 'unosdk' && ' -IncludeUnoSdkHead' || '' }} ${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} - name: MSBuild - if: ${{ matrix.multitarget != 'wasm' || matrix.winui == 2 }} + if: ${{ matrix.multitarget != 'unosdk' }} working-directory: ./${{ env.TEST_PROJECT_DIRECTORY }} run: msbuild.exe ${{ env.TEST_PROJECT_NAME }}.sln /restore /nowarn:MSB4011 -p:Configuration=Release /m ${{ env.ENABLE_DIAGNOSTICS == 'true' && '/bl' || '' }} /v:${{ env.MSBUILD_VERBOSITY }} - - name: Build Uno head (browserwasm) - if: ${{ matrix.multitarget == 'wasm' && matrix.winui == 3 }} - working-directory: ./${{ env.TEST_PROJECT_DIRECTORY }} - run: dotnet build heads/Uno/${{ env.TEST_PROJECT_NAME }}.Uno.csproj -f net9.0-browserwasm -p:Configuration=Release - - - name: Build Uno head (desktop) - if: ${{ matrix.multitarget == 'wasm' && matrix.winui == 3 }} + - name: Build Uno head + if: ${{ matrix.multitarget == 'unosdk' }} working-directory: ./${{ env.TEST_PROJECT_DIRECTORY }} - run: dotnet build heads/Uno/${{ env.TEST_PROJECT_NAME }}.Uno.csproj -f net9.0-desktop -p:Configuration=Release + run: dotnet build heads/Uno/${{ env.TEST_PROJECT_NAME }}.Uno.csproj -p:Configuration=Release # Run tests - name: Setup VSTest Path From 93b31a4191b2f726c9eb5d37d2a1418edafc8029 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Wed, 25 Feb 2026 11:18:06 +0100 Subject: [PATCH 12/25] Pick correct dependencies for Uno --- ProjectHeads/App.Head.Uno.props | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ProjectHeads/App.Head.Uno.props b/ProjectHeads/App.Head.Uno.props index 900312c4..7ff16c8f 100644 --- a/ProjectHeads/App.Head.Uno.props +++ b/ProjectHeads/App.Head.Uno.props @@ -28,5 +28,6 @@ This import must be inside THIS file to allow swapping between Uno.UI and Uno.WinUI via pwsh. Changes to this file are suppressed by git when switching to avoid changing the default for all users. --> - + + From 4e1128985510b0efe3ded7bcd6e582cab1d01bf3 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Wed, 25 Feb 2026 13:01:00 +0100 Subject: [PATCH 13/25] Adjust DependencyVariant --- ProjectHeads/App.Head.Uno.props | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ProjectHeads/App.Head.Uno.props b/ProjectHeads/App.Head.Uno.props index 7ff16c8f..7e9235e4 100644 --- a/ProjectHeads/App.Head.Uno.props +++ b/ProjectHeads/App.Head.Uno.props @@ -1,6 +1,7 @@ - WinUI + WinUI + Uwp From 588a97683ebf625a847cb9b02d67a5aa09f4ab9c Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Wed, 25 Feb 2026 13:26:37 +0100 Subject: [PATCH 14/25] Adjust Markdown sample --- .../Renderers/Markdown/MarkdownTextBlock.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CommunityToolkit.App.Shared/Renderers/Markdown/MarkdownTextBlock.cs b/CommunityToolkit.App.Shared/Renderers/Markdown/MarkdownTextBlock.cs index 2b0d3293..76ef5e8d 100644 --- a/CommunityToolkit.App.Shared/Renderers/Markdown/MarkdownTextBlock.cs +++ b/CommunityToolkit.App.Shared/Renderers/Markdown/MarkdownTextBlock.cs @@ -16,7 +16,7 @@ #endif #endif -#if HAS_UNO_WASM +#if HAS_UNO_WASM && !WINUI3 using Markdig; using Uno.Foundation.Interop; using Uno.UI.Runtime.WebAssembly; @@ -27,7 +27,7 @@ namespace CommunityToolkit.App.Shared.Renderers; /// /// Provide an abstraction around the Toolkit MarkdownTextBlock for both UWP and WinUI 3 in the same namespace (until 8.0) as well as a polyfill for WebAssembly/WASM. /// -#if HAS_UNO_WASM +#if HAS_UNO_WASM && !WINUI3 [HtmlElement("div")] public partial class MarkdownTextBlock : TextBlock { From 7b8fb299e076157ea5e5987bb05a58582fd7dac8 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Wed, 25 Feb 2026 20:10:41 +0100 Subject: [PATCH 15/25] Add missing uno prop --- .../AllComponents/Uno/CommunityToolkit.App.Uno.csproj | 3 ++- ProjectHeads/SingleComponent/Uno/ProjectTemplate.Uno.csproj | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj b/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj index 84f2e122..c3a17a41 100644 --- a/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj +++ b/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj @@ -8,6 +8,7 @@ false + true CommunityToolkit.App.Uno @@ -31,7 +32,7 @@ - + diff --git a/ProjectHeads/SingleComponent/Uno/ProjectTemplate.Uno.csproj b/ProjectHeads/SingleComponent/Uno/ProjectTemplate.Uno.csproj index aba78b06..cfd53b5a 100644 --- a/ProjectHeads/SingleComponent/Uno/ProjectTemplate.Uno.csproj +++ b/ProjectHeads/SingleComponent/Uno/ProjectTemplate.Uno.csproj @@ -8,6 +8,7 @@ false + true true @@ -26,8 +27,8 @@ - - + + From 039b688565f5f40c05e13a28bb9afeaf04d2d673 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Thu, 26 Feb 2026 01:16:24 +0100 Subject: [PATCH 16/25] Add icon, fully qualify App --- .../AllComponents/Uno/Assets/Icons/icon.svg | 42 ++++++ .../Uno/Assets/Icons/icon_foreground.svg | 137 ++++++++++++++++++ .../AllComponents/Uno/Assets/SharedAssets.md | 32 ++++ .../Uno/Assets/Splash/splash_screen.svg | 137 ++++++++++++++++++ .../SingleComponent/Uno/Assets/Icons/icon.svg | 42 ++++++ .../Uno/Assets/Icons/icon_foreground.svg | 137 ++++++++++++++++++ .../Uno/Assets/SharedAssets.md | 32 ++++ .../Uno/Assets/Splash/splash_screen.svg | 137 ++++++++++++++++++ .../Uno/Platforms/Android/Main.Android.cs | 2 +- .../Uno/Platforms/Desktop/Program.cs | 2 +- .../Uno/Platforms/WebAssembly/Program.cs | 2 +- 11 files changed, 699 insertions(+), 3 deletions(-) create mode 100644 ProjectHeads/AllComponents/Uno/Assets/Icons/icon.svg create mode 100644 ProjectHeads/AllComponents/Uno/Assets/Icons/icon_foreground.svg create mode 100644 ProjectHeads/AllComponents/Uno/Assets/SharedAssets.md create mode 100644 ProjectHeads/AllComponents/Uno/Assets/Splash/splash_screen.svg create mode 100644 ProjectHeads/SingleComponent/Uno/Assets/Icons/icon.svg create mode 100644 ProjectHeads/SingleComponent/Uno/Assets/Icons/icon_foreground.svg create mode 100644 ProjectHeads/SingleComponent/Uno/Assets/SharedAssets.md create mode 100644 ProjectHeads/SingleComponent/Uno/Assets/Splash/splash_screen.svg diff --git a/ProjectHeads/AllComponents/Uno/Assets/Icons/icon.svg b/ProjectHeads/AllComponents/Uno/Assets/Icons/icon.svg new file mode 100644 index 00000000..a15af53a --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Assets/Icons/icon.svg @@ -0,0 +1,42 @@ + + + + + + diff --git a/ProjectHeads/AllComponents/Uno/Assets/Icons/icon_foreground.svg b/ProjectHeads/AllComponents/Uno/Assets/Icons/icon_foreground.svg new file mode 100644 index 00000000..8ffc41ae --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Assets/Icons/icon_foreground.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ProjectHeads/AllComponents/Uno/Assets/SharedAssets.md b/ProjectHeads/AllComponents/Uno/Assets/SharedAssets.md new file mode 100644 index 00000000..b1cc4e76 --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Assets/SharedAssets.md @@ -0,0 +1,32 @@ +# Shared Assets + +See documentation about assets here: https://github.com/unoplatform/uno/blob/master/doc/articles/features/working-with-assets.md + +## Here is a cheat sheet + +1. Add the image file to the `Assets` directory of a shared project. +2. Set the build action to `Content`. +3. (Recommended) Provide an asset for various scales/dpi + +### Examples + +```text +\Assets\Images\logo.scale-100.png +\Assets\Images\logo.scale-200.png +\Assets\Images\logo.scale-400.png + +\Assets\Images\scale-100\logo.png +\Assets\Images\scale-200\logo.png +\Assets\Images\scale-400\logo.png +``` + +### Table of scales + +| Scale | WinUI | iOS | Android | +|-------|:-----------:|:---------------:|:-------:| +| `100` | scale-100 | @1x | mdpi | +| `125` | scale-125 | N/A | N/A | +| `150` | scale-150 | N/A | hdpi | +| `200` | scale-200 | @2x | xhdpi | +| `300` | scale-300 | @3x | xxhdpi | +| `400` | scale-400 | N/A | xxxhdpi | diff --git a/ProjectHeads/AllComponents/Uno/Assets/Splash/splash_screen.svg b/ProjectHeads/AllComponents/Uno/Assets/Splash/splash_screen.svg new file mode 100644 index 00000000..8ffc41ae --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Assets/Splash/splash_screen.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ProjectHeads/SingleComponent/Uno/Assets/Icons/icon.svg b/ProjectHeads/SingleComponent/Uno/Assets/Icons/icon.svg new file mode 100644 index 00000000..a15af53a --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Assets/Icons/icon.svg @@ -0,0 +1,42 @@ + + + + + + diff --git a/ProjectHeads/SingleComponent/Uno/Assets/Icons/icon_foreground.svg b/ProjectHeads/SingleComponent/Uno/Assets/Icons/icon_foreground.svg new file mode 100644 index 00000000..8ffc41ae --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Assets/Icons/icon_foreground.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ProjectHeads/SingleComponent/Uno/Assets/SharedAssets.md b/ProjectHeads/SingleComponent/Uno/Assets/SharedAssets.md new file mode 100644 index 00000000..b1cc4e76 --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Assets/SharedAssets.md @@ -0,0 +1,32 @@ +# Shared Assets + +See documentation about assets here: https://github.com/unoplatform/uno/blob/master/doc/articles/features/working-with-assets.md + +## Here is a cheat sheet + +1. Add the image file to the `Assets` directory of a shared project. +2. Set the build action to `Content`. +3. (Recommended) Provide an asset for various scales/dpi + +### Examples + +```text +\Assets\Images\logo.scale-100.png +\Assets\Images\logo.scale-200.png +\Assets\Images\logo.scale-400.png + +\Assets\Images\scale-100\logo.png +\Assets\Images\scale-200\logo.png +\Assets\Images\scale-400\logo.png +``` + +### Table of scales + +| Scale | WinUI | iOS | Android | +|-------|:-----------:|:---------------:|:-------:| +| `100` | scale-100 | @1x | mdpi | +| `125` | scale-125 | N/A | N/A | +| `150` | scale-150 | N/A | hdpi | +| `200` | scale-200 | @2x | xhdpi | +| `300` | scale-300 | @3x | xxhdpi | +| `400` | scale-400 | N/A | xxxhdpi | diff --git a/ProjectHeads/SingleComponent/Uno/Assets/Splash/splash_screen.svg b/ProjectHeads/SingleComponent/Uno/Assets/Splash/splash_screen.svg new file mode 100644 index 00000000..8ffc41ae --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Assets/Splash/splash_screen.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/Android/Main.Android.cs b/ProjectHeads/SingleComponent/Uno/Platforms/Android/Main.Android.cs index 18ea8687..1320bd16 100644 --- a/ProjectHeads/SingleComponent/Uno/Platforms/Android/Main.Android.cs +++ b/ProjectHeads/SingleComponent/Uno/Platforms/Android/Main.Android.cs @@ -5,7 +5,7 @@ namespace CommunityToolkit.App.Uno; [global::Android.App.ApplicationAttribute( Label = "@string/ApplicationName", - Icon = "@mipmap/iconapp", + Icon = "@mipmap/icon", LargeHeap = true, HardwareAccelerated = true, Theme = "@style/AppTheme" diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/Desktop/Program.cs b/ProjectHeads/SingleComponent/Uno/Platforms/Desktop/Program.cs index 031d0325..9b52e353 100644 --- a/ProjectHeads/SingleComponent/Uno/Platforms/Desktop/Program.cs +++ b/ProjectHeads/SingleComponent/Uno/Platforms/Desktop/Program.cs @@ -7,7 +7,7 @@ internal class Program public static void Main(string[] args) { var host = UnoPlatformHostBuilder.Create() - .App(() => new App()) + .App(() => new CommunityToolkit.App.Shared.App()) .UseX11() .UseLinuxFrameBuffer() .UseMacOS() diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/Program.cs b/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/Program.cs index d1707888..98f394da 100644 --- a/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/Program.cs +++ b/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/Program.cs @@ -6,7 +6,7 @@ public class Program public static async Task Main(string[] args) { var host = UnoPlatformHostBuilder.Create() - .App(() => new App()) + .App(() => new CommunityToolkit.App.Shared.App()) .UseWebAssembly() .Build(); From 54b711e52562ba8691df116dac43efaeca0943da Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Thu, 26 Feb 2026 01:44:02 +0100 Subject: [PATCH 17/25] Fully qualify on all components --- .../AllComponents/Uno/Platforms/Android/Main.Android.cs | 2 +- ProjectHeads/AllComponents/Uno/Platforms/Desktop/Program.cs | 2 +- ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/Program.cs | 2 +- ProjectHeads/AllComponents/Uno/Platforms/iOS/Main.iOS.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ProjectHeads/AllComponents/Uno/Platforms/Android/Main.Android.cs b/ProjectHeads/AllComponents/Uno/Platforms/Android/Main.Android.cs index 18ea8687..1320bd16 100644 --- a/ProjectHeads/AllComponents/Uno/Platforms/Android/Main.Android.cs +++ b/ProjectHeads/AllComponents/Uno/Platforms/Android/Main.Android.cs @@ -5,7 +5,7 @@ namespace CommunityToolkit.App.Uno; [global::Android.App.ApplicationAttribute( Label = "@string/ApplicationName", - Icon = "@mipmap/iconapp", + Icon = "@mipmap/icon", LargeHeap = true, HardwareAccelerated = true, Theme = "@style/AppTheme" diff --git a/ProjectHeads/AllComponents/Uno/Platforms/Desktop/Program.cs b/ProjectHeads/AllComponents/Uno/Platforms/Desktop/Program.cs index 031d0325..9b52e353 100644 --- a/ProjectHeads/AllComponents/Uno/Platforms/Desktop/Program.cs +++ b/ProjectHeads/AllComponents/Uno/Platforms/Desktop/Program.cs @@ -7,7 +7,7 @@ internal class Program public static void Main(string[] args) { var host = UnoPlatformHostBuilder.Create() - .App(() => new App()) + .App(() => new CommunityToolkit.App.Shared.App()) .UseX11() .UseLinuxFrameBuffer() .UseMacOS() diff --git a/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/Program.cs b/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/Program.cs index d1707888..98f394da 100644 --- a/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/Program.cs +++ b/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/Program.cs @@ -6,7 +6,7 @@ public class Program public static async Task Main(string[] args) { var host = UnoPlatformHostBuilder.Create() - .App(() => new App()) + .App(() => new CommunityToolkit.App.Shared.App()) .UseWebAssembly() .Build(); diff --git a/ProjectHeads/AllComponents/Uno/Platforms/iOS/Main.iOS.cs b/ProjectHeads/AllComponents/Uno/Platforms/iOS/Main.iOS.cs index 2acc5ec3..139154bc 100644 --- a/ProjectHeads/AllComponents/Uno/Platforms/iOS/Main.iOS.cs +++ b/ProjectHeads/AllComponents/Uno/Platforms/iOS/Main.iOS.cs @@ -8,7 +8,7 @@ public class EntryPoint public static void Main(string[] args) { var host = UnoPlatformHostBuilder.Create() - .App(() => new App()) + .App(() => new CommunityToolkit.App.Shared.App()) .UseAppleUIKit() .Build(); From 389f7b2a1d760edf08f7ccc5dc52b6ff1e3ab1af Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Thu, 26 Feb 2026 02:45:42 +0100 Subject: [PATCH 18/25] Add missing webmanifest --- .../Uno/Platforms/WebAssembly/manifest.webmanifest | 10 ++++++++++ .../Uno/Platforms/WebAssembly/manifest.webmanifest | 10 ++++++++++ 2 files changed, 20 insertions(+) create mode 100644 ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/manifest.webmanifest create mode 100644 ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/manifest.webmanifest diff --git a/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/manifest.webmanifest b/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/manifest.webmanifest new file mode 100644 index 00000000..8d6e55be --- /dev/null +++ b/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/manifest.webmanifest @@ -0,0 +1,10 @@ +{ + "name": "CommunityToolkit", + "description": "CommunityToolkit", + "short_name": "CommunityToolkit", + "start_url": "/index.html", + "display": "standalone", + "background_color": "#FFFFFF", + "theme_color": "#FFFFFF", + "scope": "/" +} diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/manifest.webmanifest b/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/manifest.webmanifest new file mode 100644 index 00000000..8d6e55be --- /dev/null +++ b/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/manifest.webmanifest @@ -0,0 +1,10 @@ +{ + "name": "CommunityToolkit", + "description": "CommunityToolkit", + "short_name": "CommunityToolkit", + "start_url": "/index.html", + "display": "standalone", + "background_color": "#FFFFFF", + "theme_color": "#FFFFFF", + "scope": "/" +} From ce07079e6289df5163c87e4b83ea21ac681bc38f Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Thu, 26 Feb 2026 02:58:07 +0100 Subject: [PATCH 19/25] Fully qualify iOS --- ProjectHeads/SingleComponent/Uno/Platforms/iOS/Main.iOS.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Main.iOS.cs b/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Main.iOS.cs index 2acc5ec3..139154bc 100644 --- a/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Main.iOS.cs +++ b/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Main.iOS.cs @@ -8,7 +8,7 @@ public class EntryPoint public static void Main(string[] args) { var host = UnoPlatformHostBuilder.Create() - .App(() => new App()) + .App(() => new CommunityToolkit.App.Shared.App()) .UseAppleUIKit() .Build(); From 9ba4c3e991cda894273949a76c534bc92b601ca8 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Thu, 26 Feb 2026 09:24:55 +0100 Subject: [PATCH 20/25] Disable AOT on Android --- .../AllComponents/Uno/CommunityToolkit.App.Uno.csproj | 5 +++++ ProjectHeads/SingleComponent/Uno/ProjectTemplate.Uno.csproj | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj b/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj index c3a17a41..4d624ad3 100644 --- a/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj +++ b/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj @@ -88,4 +88,9 @@ $(NoWarn);IL2026;Uno0006 + + + + false + diff --git a/ProjectHeads/SingleComponent/Uno/ProjectTemplate.Uno.csproj b/ProjectHeads/SingleComponent/Uno/ProjectTemplate.Uno.csproj index cfd53b5a..93982a4c 100644 --- a/ProjectHeads/SingleComponent/Uno/ProjectTemplate.Uno.csproj +++ b/ProjectHeads/SingleComponent/Uno/ProjectTemplate.Uno.csproj @@ -83,4 +83,9 @@ $(NoWarn);IL2026;Uno0006 + + + + false + From 5457779ed869c8d1293dcfec798e21e67ff6d1bf Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Thu, 26 Feb 2026 15:06:34 +0100 Subject: [PATCH 21/25] Rename pipeline --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 80f6b60c..0aa6f9ad 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -274,8 +274,8 @@ jobs: name: new-experiment-logs-${{ matrix.multitarget }}-winui${{ matrix.winui }} path: ./**/*.*log - uno-linux: - runs-on: windows-2022 + uno-windows: + runs-on: ubuntu-latest env: HEADS_DIRECTORY: tooling/ProjectHeads PROJECT_DIRECTORY: tooling/ProjectTemplate From 8df43817b2c950d228db729eeb79d0edb07e3def Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Wed, 17 Jun 2026 15:02:21 +0200 Subject: [PATCH 22/25] Fix uno-linux CI job: drop iOS/maui workloads on Linux The job runs on ubuntu-latest but installed ios/maui workloads which aren't supported on Linux, failing at the install step. Uno.Sdk auto-filters the iOS TFM on Linux, so only android + wasm-tools are needed for the desktop/browserwasm heads this job builds. Also renamed the job from the misleading "uno-windows" back to "uno-linux". Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/build.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0aa6f9ad..8a50ca60 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -274,7 +274,7 @@ jobs: name: new-experiment-logs-${{ matrix.multitarget }}-winui${{ matrix.winui }} path: ./**/*.*log - uno-windows: + uno-linux: runs-on: ubuntu-latest env: HEADS_DIRECTORY: tooling/ProjectHeads @@ -293,8 +293,11 @@ jobs: with: global-json-file: tooling/global.json + # iOS/maccatalyst workloads aren't installable on Linux, and Uno.Sdk + # auto-filters those TFMs on Linux. Only wasm-tools (browserwasm) and + # android are needed for the desktop/wasm heads built here. - name: Install .NET workloads - run: dotnet workload install android ios maui wasm-tools + run: dotnet workload install android wasm-tools - name: .NET Info (if diagnostics) if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }} From 0ab40f3a2564fdc69ca14ee6a47d06bfc2961784 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Wed, 17 Jun 2026 15:07:49 +0200 Subject: [PATCH 23/25] Remove Windows-only setup-msbuild from uno-linux job The uno-linux job runs on ubuntu-latest and all its build steps use dotnet (slngen, dotnet build). The microsoft/setup-msbuild action is Windows-only and fails on Linux. Remove it. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/build.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8a50ca60..1be1085c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -313,9 +313,6 @@ jobs: copy ./tooling/.config/dotnet-tools.json ./.config/dotnet-tools.json mkdir ./components - - name: Add msbuild to PATH - uses: microsoft/setup-msbuild@v2 - # Restore Tools from Manifest list in the Repository - name: Restore dotnet tools working-directory: ./ From ed352f7f8097eb3b196b2f3e95cf3ef3c3526de3 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Wed, 17 Jun 2026 15:18:30 +0200 Subject: [PATCH 24/25] Fix workload band mismatch in uno-linux job dotnet workload install ran at the repo root before global.json was copied there, so it installed android/wasm-tools for the runner's preinstalled SDK 10 band. The build is pinned to the 9.0.x band via global.json, where no workloads were present, causing NETSDK1147. Run the install from ./tooling so global.json scopes it to the right band. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/build.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1be1085c..a2333e97 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -293,10 +293,16 @@ jobs: with: global-json-file: tooling/global.json - # iOS/maccatalyst workloads aren't installable on Linux, and Uno.Sdk - # auto-filters those TFMs on Linux. Only wasm-tools (browserwasm) and - # android are needed for the desktop/wasm heads built here. + # iOS/maccatalyst workloads aren't installable on Linux (Uno.Sdk + # auto-filters those TFMs there). android + wasm-tools are both + # required: even a `-f net9.0-browserwasm` build restores all of the + # head's TargetFrameworks, so the net9.0-android TFM's workload is + # validated during restore. + # Run from ./tooling so global.json scopes the install to the pinned + # SDK feature band; otherwise the workloads land on the runner's newer + # preinstalled SDK and the 9.0.x build can't see them (NETSDK1147). - name: Install .NET workloads + working-directory: tooling run: dotnet workload install android wasm-tools - name: .NET Info (if diagnostics) From 01a12c096201407269c3d7a55b94d57de36a77d3 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Wed, 17 Jun 2026 15:58:54 +0200 Subject: [PATCH 25/25] Add license headers to Uno head platform files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The new Uno.Sdk head platform entry-point files (Desktop/WebAssembly/ Android/iOS) were missing the standard .NET Foundation license header. Consumers that enforce IDE0073 (file header required) as an error — like CommunityToolkit/Windows — fail to build the Uno head without them. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../AllComponents/Uno/Platforms/Android/Main.Android.cs | 6 +++++- .../Uno/Platforms/Android/MainActivity.Android.cs | 6 +++++- ProjectHeads/AllComponents/Uno/Platforms/Desktop/Program.cs | 6 +++++- .../AllComponents/Uno/Platforms/WebAssembly/Program.cs | 6 +++++- ProjectHeads/AllComponents/Uno/Platforms/iOS/Main.iOS.cs | 6 +++++- .../SingleComponent/Uno/Platforms/Android/Main.Android.cs | 6 +++++- .../Uno/Platforms/Android/MainActivity.Android.cs | 6 +++++- .../SingleComponent/Uno/Platforms/Desktop/Program.cs | 6 +++++- .../SingleComponent/Uno/Platforms/WebAssembly/Program.cs | 6 +++++- ProjectHeads/SingleComponent/Uno/Platforms/iOS/Main.iOS.cs | 6 +++++- 10 files changed, 50 insertions(+), 10 deletions(-) diff --git a/ProjectHeads/AllComponents/Uno/Platforms/Android/Main.Android.cs b/ProjectHeads/AllComponents/Uno/Platforms/Android/Main.Android.cs index 1320bd16..31d89a6f 100644 --- a/ProjectHeads/AllComponents/Uno/Platforms/Android/Main.Android.cs +++ b/ProjectHeads/AllComponents/Uno/Platforms/Android/Main.Android.cs @@ -1,3 +1,7 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + using Android.App; using Android.Runtime; @@ -16,4 +20,4 @@ public Application(IntPtr javaReference, JniHandleOwnership transfer) : base(() => new CommunityToolkit.App.Shared.App(), javaReference, transfer) { } -} +} \ No newline at end of file diff --git a/ProjectHeads/AllComponents/Uno/Platforms/Android/MainActivity.Android.cs b/ProjectHeads/AllComponents/Uno/Platforms/Android/MainActivity.Android.cs index c0164819..ad38d011 100644 --- a/ProjectHeads/AllComponents/Uno/Platforms/Android/MainActivity.Android.cs +++ b/ProjectHeads/AllComponents/Uno/Platforms/Android/MainActivity.Android.cs @@ -1,3 +1,7 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + using Android.App; using Android.Content.PM; using Android.OS; @@ -13,4 +17,4 @@ namespace CommunityToolkit.App.Uno; )] public class MainActivity : Microsoft.UI.Xaml.ApplicationActivity { -} +} \ No newline at end of file diff --git a/ProjectHeads/AllComponents/Uno/Platforms/Desktop/Program.cs b/ProjectHeads/AllComponents/Uno/Platforms/Desktop/Program.cs index 9b52e353..2f5400b3 100644 --- a/ProjectHeads/AllComponents/Uno/Platforms/Desktop/Program.cs +++ b/ProjectHeads/AllComponents/Uno/Platforms/Desktop/Program.cs @@ -1,3 +1,7 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + using Uno.UI.Hosting; using CommunityToolkit.App.Shared; @@ -16,4 +20,4 @@ public static void Main(string[] args) host.Run(); } -} +} \ No newline at end of file diff --git a/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/Program.cs b/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/Program.cs index 98f394da..f07914ec 100644 --- a/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/Program.cs +++ b/ProjectHeads/AllComponents/Uno/Platforms/WebAssembly/Program.cs @@ -1,3 +1,7 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + using Uno.UI.Hosting; using CommunityToolkit.App.Shared; @@ -12,4 +16,4 @@ public static async Task Main(string[] args) await host.RunAsync(); } -} +} \ No newline at end of file diff --git a/ProjectHeads/AllComponents/Uno/Platforms/iOS/Main.iOS.cs b/ProjectHeads/AllComponents/Uno/Platforms/iOS/Main.iOS.cs index 139154bc..b163d7dd 100644 --- a/ProjectHeads/AllComponents/Uno/Platforms/iOS/Main.iOS.cs +++ b/ProjectHeads/AllComponents/Uno/Platforms/iOS/Main.iOS.cs @@ -1,3 +1,7 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + using Uno.UI.Hosting; using CommunityToolkit.App.Shared; @@ -14,4 +18,4 @@ public static void Main(string[] args) host.Run(); } -} +} \ No newline at end of file diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/Android/Main.Android.cs b/ProjectHeads/SingleComponent/Uno/Platforms/Android/Main.Android.cs index 1320bd16..31d89a6f 100644 --- a/ProjectHeads/SingleComponent/Uno/Platforms/Android/Main.Android.cs +++ b/ProjectHeads/SingleComponent/Uno/Platforms/Android/Main.Android.cs @@ -1,3 +1,7 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + using Android.App; using Android.Runtime; @@ -16,4 +20,4 @@ public Application(IntPtr javaReference, JniHandleOwnership transfer) : base(() => new CommunityToolkit.App.Shared.App(), javaReference, transfer) { } -} +} \ No newline at end of file diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/Android/MainActivity.Android.cs b/ProjectHeads/SingleComponent/Uno/Platforms/Android/MainActivity.Android.cs index c0164819..ad38d011 100644 --- a/ProjectHeads/SingleComponent/Uno/Platforms/Android/MainActivity.Android.cs +++ b/ProjectHeads/SingleComponent/Uno/Platforms/Android/MainActivity.Android.cs @@ -1,3 +1,7 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + using Android.App; using Android.Content.PM; using Android.OS; @@ -13,4 +17,4 @@ namespace CommunityToolkit.App.Uno; )] public class MainActivity : Microsoft.UI.Xaml.ApplicationActivity { -} +} \ No newline at end of file diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/Desktop/Program.cs b/ProjectHeads/SingleComponent/Uno/Platforms/Desktop/Program.cs index 9b52e353..2f5400b3 100644 --- a/ProjectHeads/SingleComponent/Uno/Platforms/Desktop/Program.cs +++ b/ProjectHeads/SingleComponent/Uno/Platforms/Desktop/Program.cs @@ -1,3 +1,7 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + using Uno.UI.Hosting; using CommunityToolkit.App.Shared; @@ -16,4 +20,4 @@ public static void Main(string[] args) host.Run(); } -} +} \ No newline at end of file diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/Program.cs b/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/Program.cs index 98f394da..f07914ec 100644 --- a/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/Program.cs +++ b/ProjectHeads/SingleComponent/Uno/Platforms/WebAssembly/Program.cs @@ -1,3 +1,7 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + using Uno.UI.Hosting; using CommunityToolkit.App.Shared; @@ -12,4 +16,4 @@ public static async Task Main(string[] args) await host.RunAsync(); } -} +} \ No newline at end of file diff --git a/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Main.iOS.cs b/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Main.iOS.cs index 139154bc..b163d7dd 100644 --- a/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Main.iOS.cs +++ b/ProjectHeads/SingleComponent/Uno/Platforms/iOS/Main.iOS.cs @@ -1,3 +1,7 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + using Uno.UI.Hosting; using CommunityToolkit.App.Shared; @@ -14,4 +18,4 @@ public static void Main(string[] args) host.Run(); } -} +} \ No newline at end of file