Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
c7efbfa
chore: adopt Uno 7 tooling and SDK pins
MartinZikmund Oct 9, 2026
7bb22c2
feat(MarkdownTextBlock): multi-target Uno Platform 7 heads
MartinZikmund Oct 9, 2026
fe033a8
fix(MarkdownTextBlock): annotate GetPositionAtOffset result as nullable
MartinZikmund Oct 9, 2026
203e325
fix(MarkdownTextBlock): use RenderTransform on Uno where Transform3D …
MartinZikmund Oct 9, 2026
b1251bb
chore: bump tooling to latest Uno 7 branch head
MartinZikmund Oct 9, 2026
bc17fe7
Merge main into mzikmund/mtb-uno7
MartinZikmund Nov 3, 2026
987820e
Rename the linuxgtk MultiTarget to linux, add win32
MartinZikmund Nov 3, 2026
7114e8b
CI: Build the gallery through the Uno.Sdk head on WinUI 3
MartinZikmund Nov 3, 2026
eb11ab9
fix(MarkdownTextBlock): make MarkdownThemes partial
MartinZikmund Nov 3, 2026
ab65669
fix(MarkdownTextBlock): disambiguate Markdig's TableRow
MartinZikmund Nov 3, 2026
abc5aef
chore: bump tooling to latest Uno 7 branch head
MartinZikmund Nov 3, 2026
3973b16
chore: bump tooling to latest Uno 7 branch head
MartinZikmund Nov 3, 2026
a92bf3a
chore: bump uno-check to 1.34.1
MartinZikmund Nov 3, 2026
456231b
fix(TokenView): use XamlRoot on WinUI 3 without probing for it
MartinZikmund Nov 3, 2026
6124d05
CI: Install the current Android workload on the WinUI 3 Android job
MartinZikmund Nov 3, 2026
80fed68
fix(MarkdownTextBlock): drop the Android SDK's implicit usings
MartinZikmund Nov 3, 2026
9c18376
fix(MarkdownTextBlock): qualify Debug in the samples
MartinZikmund Nov 3, 2026
cfe32ba
CI: Update rather than install the Android workload
MartinZikmund Nov 3, 2026
69f5f35
chore: bump tooling to latest Uno 7 branch head
MartinZikmund Nov 3, 2026
e953a3e
chore: bump Uno.Sdk to 7.0.0-dev.132 and tooling
MartinZikmund Nov 4, 2026
60ed6f5
fix(RivePlayer): render through Uno's SKCanvasElement on Uno 7
MartinZikmund Nov 4, 2026
ccc8380
chore: bump Uno.Sdk to stable 7.0.5 and tooling
MartinZikmund Nov 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .config/dotnet-tools.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"isRoot": true,
"tools": {
"uno.check": {
"version": "1.33.1",
"version": "1.34.1",
"commands": [
"uno-check"
]
Expand Down
70 changes: 53 additions & 17 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -72,14 +72,26 @@ 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', 'wpf', 'linuxgtk', 'macos', 'ios', 'android']
multitarget: ['uwp', 'wasdk', 'wasm', 'wpf', 'win32', 'linux', 'macos', 'ios', 'android']
exclude:
# WinUI 2 not supported on wasdk
- winui: 2
multitarget: wasdk
# WinUI 3 not supported on uwp
- winui: 3
multitarget: uwp
# wpf is the Uno 5 Skia WPF head, which Uno 6 replaced with win32
- winui: 3
multitarget: wpf
# win32 is the Uno 6 Skia desktop head, which has no Uno 5 equivalent
- winui: 2
multitarget: win32
include:
# On WinUI 3 the Uno.Sdk head replaces the classic Wasm head, so it rides on the
# existing wasm job as a flag rather than a fake entry in the multitarget axis.
- winui: 3
multitarget: wasm
unoSdkHead: true

env:
MULTI_TARGET_DIRECTORY: tooling/MultiTarget
Expand Down Expand Up @@ -167,7 +179,7 @@ jobs:
run: dotnet tool restore

- name: Run Uno Check to Install Dependencies
if: ${{ matrix.multitarget != 'wasdk' && matrix.multitarget != 'linuxgtk' && matrix.multitarget != 'wpf' && env.HAS_BUILDABLE_COMPONENTS == 'true' }}
if: ${{ matrix.multitarget != 'wasdk' && matrix.multitarget != 'linux' && matrix.multitarget != 'wpf' && matrix.multitarget != 'win32' && !matrix.unoSdkHead && env.HAS_BUILDABLE_COMPONENTS == 'true' }}
run: >
dotnet tool run uno-check
--ci
Expand All @@ -180,6 +192,18 @@ jobs:
--skip vswin
--verbose

# uno-check pins Microsoft.Android.Sdk 36.1.2, under which the Uno 7 Android head restores a
# Mono win-x64 runtime pack that doesn't exist (NU1102); update to the current workload manifests.
- name: Update the Android workload (WinUI 3)
if: ${{ matrix.winui == 3 && matrix.multitarget == 'android' && env.HAS_BUILDABLE_COMPONENTS == 'true' }}
run: dotnet workload update

# The Uno.Sdk head builds desktop/browserwasm/android (iOS is filtered on
# Windows). Install the matching workloads directly instead of uno-check.
- name: Install .NET workloads (Uno.Sdk head)
if: ${{ matrix.unoSdkHead && env.HAS_BUILDABLE_COMPONENTS == 'true' }}
run: dotnet workload install wasm-tools android ios maui

- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v2
if: ${{ env.HAS_BUILDABLE_COMPONENTS == 'true' }}
Expand All @@ -191,11 +215,11 @@ jobs:
- name: Generate solution with ${{ matrix.multitarget }} gallery, components and tests
working-directory: ./
if: ${{ env.HAS_BUILDABLE_COMPONENTS == 'true' }}
run: powershell -version 5.1 -command "./tooling/GenerateAllSolution.ps1 -MultiTargets ${{ matrix.multitarget }} ${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} -Components ${{ env.CHANGED_COMPONENTS_LIST }} -WinUIMajorVersion ${{ matrix.winui }}" -ErrorAction Stop
run: powershell -version 5.1 -command "./tooling/GenerateAllSolution.ps1 -MultiTargets ${{ matrix.multitarget }}${{ matrix.unoSdkHead && ',win32 -IncludeUnoSdkHead' || '' }} ${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} -Components ${{ env.CHANGED_COMPONENTS_LIST }} -WinUIMajorVersion ${{ matrix.winui }}" -ErrorAction Stop

# Build solution
- name: MSBuild (With diagnostics)
if: ${{ env.ENABLE_DIAGNOSTICS == 'true' && env.HAS_BUILDABLE_COMPONENTS == 'true' }}
if: ${{ env.ENABLE_DIAGNOSTICS == 'true' && env.HAS_BUILDABLE_COMPONENTS == 'true' && !matrix.unoSdkHead }}
run: >
msbuild.exe /restore /nowarn:MSB4011
/p:Configuration=Release
Expand All @@ -205,9 +229,15 @@ jobs:
CommunityToolkit.AllComponents.sln

- name: MSBuild
if: ${{ env.ENABLE_DIAGNOSTICS == 'false' && env.HAS_BUILDABLE_COMPONENTS == 'true' }}
if: ${{ env.ENABLE_DIAGNOSTICS == 'false' && env.HAS_BUILDABLE_COMPONENTS == 'true' && !matrix.unoSdkHead }}
run: msbuild.exe CommunityToolkit.AllComponents.sln /restore /nowarn:MSB4011 -p:Configuration=Release

# The Uno.Sdk head is a single project covering desktop/browserwasm/android
# (iOS is filtered on Windows); build it directly with dotnet.
- name: Build Uno.Sdk head
if: ${{ matrix.unoSdkHead && env.HAS_BUILDABLE_COMPONENTS == 'true' }}
run: dotnet build tooling/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj -p:Configuration=Release ${{ env.ENABLE_DIAGNOSTICS == 'true' && '/bl' || '' }}

# Run tests
- name: Setup VSTest Path
uses: darenm/setup-vstest@3a16d909a1f3bbc65b52f8270d475d905e7d3e44
Expand Down Expand Up @@ -482,7 +512,7 @@ jobs:
--api-key ${{ secrets.NUGET_PACKAGE_PUSH_TOKEN }}
--skip-duplicate

wasm-linux:
uno-linux:
runs-on: ubuntu-latest
env:
HEADS_DIRECTORY: tooling/ProjectHeads
Expand All @@ -502,6 +532,12 @@ jobs:
with:
global-json-file: global.json

# iOS/maccatalyst aren't installable on Linux (Uno.Sdk filters those TFMs
# there). android + wasm-tools are both required: even a single-TFM build
# restores all of the head's TargetFrameworks, validating net10.0-android.
- name: Install .NET workloads
run: dotnet workload install android wasm-tools

- name: .NET Info (if diagnostics)
if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }}
run: dotnet --info
Expand All @@ -510,27 +546,27 @@ jobs:
- name: Restore dotnet tools
run: dotnet tool restore

# Generate the full solution with the Uno.Sdk gallery head, components and tests
- name: Generate solution
shell: pwsh
working-directory: ./
run: ./tooling/GenerateAllSolution.ps1${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }}
run: ./tooling/GenerateAllSolution.ps1 -MultiTargets wasm,linux -IncludeUnoSdkHead -WinUIMajorVersion 3${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }}

- name: Install ninja for WASM native dependencies
run: sudo apt-get install ninja-build
- name: Build Uno head (browserwasm)
shell: pwsh
working-directory: ./
run: dotnet build tooling/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj -f net10.0-browserwasm -p:Configuration=Release

# Issue with Comment Links currently, see: https://github.com/mrlacey/CommentLinks/issues/38
# See launch.json configuration file for analogous command we're emulating here to build LINK: ../../.vscode/launch.json:CommunityToolkit.App.Wasm.csproj
- name: dotnet build
working-directory: ./${{ env.HEADS_DIRECTORY }}/AllComponents/Wasm/
run: dotnet build /r /bl /p:UnoSourceGeneratorUseGenerationHost=true /p:UnoSourceGeneratorUseGenerationController=false

# TODO: Do we want to run tests here? Can we do that on linux easily?
- name: Build Uno head (desktop)
shell: pwsh
working-directory: ./
run: dotnet build tooling/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj -f net10.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


2 changes: 1 addition & 1 deletion components/Adorners/src/MultiTarget.props
Original file line number Diff line number Diff line change
Expand Up @@ -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.
-->
<MultiTarget>uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android;</MultiTarget>
<MultiTarget>uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android;</MultiTarget>
</PropertyGroup>
</Project>
2 changes: 1 addition & 1 deletion components/GradientSlider/src/MultiTarget.props
Original file line number Diff line number Diff line change
Expand Up @@ -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.
-->
<MultiTarget>uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android;</MultiTarget>
<MultiTarget>uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android;</MultiTarget>
</PropertyGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
// See the LICENSE file in the project root for more information.

using CommunityToolkit.WinUI.Controls;
using System.Diagnostics;

namespace MarkdownTextBlockExperiment.Samples;

Expand Down Expand Up @@ -607,6 +606,6 @@ public MarkdownTextBlockExampleSample()

private void MarkdownTextBlock_OnLinkClicked(object? sender, LinkClickedEventArgs e)
{
Debug.WriteLine($"Link Clicked: {e.Uri}");
System.Diagnostics.Debug.WriteLine($"Link Clicked: {e.Uri}");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
// See the LICENSE file in the project root for more information.

using CommunityToolkit.WinUI.Controls;
using System.Diagnostics;

namespace MarkdownTextBlockExperiment.Samples;

Expand Down Expand Up @@ -43,6 +42,6 @@ Try typing some **markdown** here!

private void MarkdownTextBlock_OnLinkClicked(object? sender, LinkClickedEventArgs e)
{
Debug.WriteLine($"Link Clicked: {e.Uri}");
System.Diagnostics.Debug.WriteLine($"Link Clicked: {e.Uri}");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,22 +25,30 @@
<PackageReference Include="Markdig" Version="0.38.0" />
<PackageReference Include="Roman-Numerals" Version="2.0.1" />
</ItemGroup>
<ItemGroup Condition="'$(IsUwp)' == 'true'">
<ItemGroup Condition="'$(IsUwp)' == 'true' OR ('$(IsUno)' == 'true' AND '$(WinUIMajorVersion)' == '2')">
<Using Include="Windows.UI" />
<Using Include="Windows.UI.Xaml.Documents" />
<Using Include="Windows.UI.Xaml.Media.Imaging" />
<Using Include="Windows.UI.Xaml.Media.Media3D" />
<Using Include="Windows.UI.Xaml.Shapes" />
<Using Include="Windows.UI.Text" />
</ItemGroup>
<ItemGroup Condition="'$(IsWinAppSdk)' == 'true'">
<ItemGroup Condition="'$(IsWinAppSdk)' == 'true' OR ('$(IsUno)' == 'true' AND '$(WinUIMajorVersion)' == '3')">
<Using Include="Microsoft.UI" />
<Using Include="Microsoft.UI.Xaml.Documents" />
<Using Include="Microsoft.UI.Xaml.Media.Imaging" />
<Using Include="Microsoft.UI.Xaml.Media.Media3D" />
<Using Include="Microsoft.UI.Xaml.Shapes" />
<Using Include="Microsoft.UI.Text" />
</ItemGroup>
<!-- The Android SDK's implicit usings bring in Android.App/Android.Widget types (Application, Orientation, TableRow...)
that clash with the XAML and Markdig ones. They're added by its targets, after this file, hence the target. -->
<Target Name="RemoveAndroidImplicitUsings" BeforeTargets="GenerateGlobalUsings" Condition="'$(IsDroid)' == 'true'">
<ItemGroup>
<Using Remove="Android.App" />
<Using Remove="Android.Widget" />
</ItemGroup>
</Target>
<ItemGroup>
<Compile Update="MarkdownTextBlock.xaml.cs">
<DependentUpon>MarkdownTextBlock.xaml</DependentUpon>
Expand Down
4 changes: 2 additions & 2 deletions components/MarkdownTextBlock/src/Extensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ public static string ToAlphabetical(this int index)
else
{
// Try to find the next insertion position by moving one symbol forward
TextPointer next = position.GetPositionAtOffset(1, logicalDirection);
TextPointer? next = position.GetPositionAtOffset(1, logicalDirection);
// If there is no next position, return null
if (next == null)
{
Expand All @@ -384,7 +384,7 @@ public static bool IsAtInsertionPosition(this TextPointer position, LogicalDirec
// Get the character rect of the current position
Rect currentRect = position.GetCharacterRect(logicalDirection);
// Try to get the next position by moving one symbol forward
TextPointer next = position.GetPositionAtOffset(1, logicalDirection);
TextPointer? next = position.GetPositionAtOffset(1, logicalDirection);
// If there is no next position, return false
if (next == null)
{
Expand Down
2 changes: 1 addition & 1 deletion components/MarkdownTextBlock/src/MarkdownThemes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

namespace CommunityToolkit.WinUI.Controls;

public sealed class MarkdownThemes : DependencyObject
public sealed partial class MarkdownThemes : DependencyObject
{
internal static MarkdownThemes Default { get; } = new();

Expand Down
2 changes: 1 addition & 1 deletion components/MarkdownTextBlock/src/MultiTarget.props
Original file line number Diff line number Diff line change
Expand Up @@ -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.
-->
<MultiTarget>uwp;wasdk;</MultiTarget>
<MultiTarget>uwp;wasdk;wasm;win32;linux;macos;ios;android;</MultiTarget>
</PropertyGroup>
</Project>
5 changes: 5 additions & 0 deletions components/MarkdownTextBlock/src/TextElements/MyInlineCode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,14 @@ public MyInlineCode(CodeInline codeInline, MarkdownConfig config)
border.BorderThickness = _config.Themes.InlineCodeBorderThickness;
border.CornerRadius = _config.Themes.InlineCodeCornerRadius;
border.Padding = _config.Themes.InlineCodePadding;
#if HAS_UNO
// UIElement.Transform3D is not implemented on Uno
border.RenderTransform = new TranslateTransform { Y = 4 };
#else
CompositeTransform3D transform = new CompositeTransform3D();
transform.TranslateY = 4;
border.Transform3D = transform;
#endif
var textBlock = new TextBlock();
textBlock.FontSize = _config.Themes.InlineCodeFontSize;
textBlock.Foreground = _config.Themes.InlineCodeForeground;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,14 @@ public MyTaskListCheckBox(TaskList taskList)
{
_taskList = taskList;
var grid = new Grid();
#if HAS_UNO
// UIElement.Transform3D is not implemented on Uno
grid.RenderTransform = new TranslateTransform { Y = 2 };
#else
CompositeTransform3D transform = new CompositeTransform3D();
transform.TranslateY = 2;
grid.Transform3D = transform;
#endif
grid.Width = 16;
grid.Height = 16;
grid.Margin = new Thickness(2, 0, 2, 0);
Expand Down
2 changes: 1 addition & 1 deletion components/Ribbon/src/MultiTarget.props
Original file line number Diff line number Diff line change
Expand Up @@ -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.
-->
<MultiTarget>uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android;</MultiTarget>
<MultiTarget>uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android;</MultiTarget>
</PropertyGroup>
</Project>
4 changes: 2 additions & 2 deletions components/RivePlayer/src/Dependencies.props
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@
<PackageReference Include="SkiaSharp.Views.WinUI" Version="2.88.6" />
</ItemGroup>

<!-- WinUI 3 / Uno -->
<!-- WinUI 3 / Uno: SkiaSharp.Views.Uno.WinUI has no Uno 7 build, use Uno's SKCanvasElement instead -->
<ItemGroup Condition="'$(IsUno)' == 'true' AND '$(WinUIMajorVersion)' == '3'">
<PackageReference Include="SkiaSharp.Views.Uno.WinUI" Version="2.88.6" />
<PackageReference Include="Uno.WinUI.Graphics2DSK" Version="$(CommonUnoPackageVersion)" />
</ItemGroup>
</Project>
20 changes: 20 additions & 0 deletions components/RivePlayer/src/RiveCanvasElement.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// 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.

#if WINUI3 && HAS_UNO
using SkiaSharp;
using Uno.WinUI.Graphics2DSK;

namespace CommunityToolkit.WinUI.Rive;

internal sealed partial class RiveCanvasElement : SKCanvasElement
{
private readonly RivePlayer _owner;

public RiveCanvasElement(RivePlayer owner) => _owner = owner;

protected override void RenderOverride(SKCanvas canvas, global::Windows.Foundation.Size area) =>
_owner.PaintNextAnimationFrame(canvas, area);
}
#endif
19 changes: 16 additions & 3 deletions components/RivePlayer/src/RivePlayer.Platform.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

#if !WINAPPSDK
#if WINUI3 && HAS_UNO
using SkiaSharp;
#elif !WINAPPSDK
// WASM on WinUI2 needs SkiaSharp.Views.UWP too.
using SkiaSharp.Views.UWP;
#else
Expand Down Expand Up @@ -51,6 +53,9 @@ protected override void OnApplyTemplate()
};
swapChainPanel.PaintSurface += OnPaintSurface;
_skiaSurface.Content = swapChainPanel;
#elif WINUI3 && HAS_UNO
// SkiaSharp.Views has no Uno 7 build, so draw on Uno's own Skia canvas.
_skiaSurface.Content = new RiveCanvasElement(this);
#else
// WinAppSdk doesn't have SKSwapChainPanel yet.
// SKSwapChainPanel doesn't work in WASM yet.
Expand All @@ -71,6 +76,8 @@ internal void InvalidateAnimation()
#if WINDOWS_UWP
var swapChainPanel = _skiaSurface?.Content as SKSwapChainPanel;
swapChainPanel?.Invalidate();
#elif WINUI3 && HAS_UNO
(_skiaSurface?.Content as RiveCanvasElement)?.Invalidate();
#else
var xamlCanvas = _skiaSurface?.Content as SKXamlCanvas;
xamlCanvas?.Invalidate();
Expand All @@ -80,12 +87,18 @@ internal void InvalidateAnimation()
#if WINDOWS_UWP
private void OnPaintSurface(object? sender, SKPaintGLSurfaceEventArgs e)
{
this.PaintNextAnimationFrame(e.Surface, e.BackendRenderTarget.Width, e.BackendRenderTarget.Height);
e.Surface.Canvas.Clear();
this.PaintNextAnimationFrame(e.Surface.Canvas, e.BackendRenderTarget.Width, e.BackendRenderTarget.Height);
}
#elif WINUI3 && HAS_UNO
// Called by RiveCanvasElement. The canvas is shared with the rest of the window, so it must not be cleared.
internal void PaintNextAnimationFrame(SKCanvas canvas, global::Windows.Foundation.Size area) =>
this.PaintNextAnimationFrame(canvas, (int)area.Width, (int)area.Height);
#else
private void OnPaintSurface(object? sender, SKPaintSurfaceEventArgs e)
{
this.PaintNextAnimationFrame(e.Surface, e.Info.Width, e.Info.Height);
e.Surface.Canvas.Clear();
this.PaintNextAnimationFrame(e.Surface.Canvas, e.Info.Width, e.Info.Height);
}
#endif

Expand Down
Loading
Loading