diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 083cc79e8..71f65c31e 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -6,7 +6,9 @@ "Bash(docfx docs/docfx.json)", "mcp__microsoft_docs__microsoft_code_sample_search", "mcp__context7__resolve-library-id", - "mcp__context7__query-docs" + "mcp__context7__query-docs", + "WebFetch(domain:devblogs.microsoft.com)", + "Bash(dotnet build *)" ] } } diff --git a/.editorconfig b/.editorconfig index 833e151fa..1f3d43af8 100644 --- a/.editorconfig +++ b/.editorconfig @@ -21,13 +21,13 @@ insert_final_newline = false #### Build files #### # Solution files -[*.{sln,slnx}] +[*.{sln}] tab_width = 4 indent_size = 4 indent_style = tab # Configuration files -[*.{json,xml,yml,config,runsettings}] +[*.{json,xml,yml,config,runsettings,slnx}] indent_size = 2 # MSBuild files diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 9af58d77e..593d10b8d 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -15,10 +15,6 @@ Central Package Management: Directory.Packages.props - NEVER add package version Build library: dotnet build src/Wpf.Ui/Wpf.Ui.csproj -Solution filters: -- Wpf.Ui.Library.slnf - Library projects only -- Wpf.Ui.Gallery.slnf - Gallery demo app - Testing: - XUnit v3 for unit tests (tests/Wpf.Ui.UnitTests/) - AwesomeAssertions for assertions (FluentAssertions successor) diff --git a/.github/workflows/wpf-ui-cd-extension.yaml b/.github/workflows/wpf-ui-cd-extension.yaml index 8cfe5caa4..1f90b7585 100644 --- a/.github/workflows/wpf-ui-cd-extension.yaml +++ b/.github/workflows/wpf-ui-cd-extension.yaml @@ -2,9 +2,9 @@ name: wpf-ui-cd-extension on: push: - branches: [main] + branches: [ main ] paths: - - 'src/Wpf.Ui.Extension**' + - "src/Wpf.Ui.Extension**" workflow_dispatch: @@ -26,13 +26,19 @@ jobs: nuget-api-key: ${{ secrets.NUGET_API_KEY }} - name: Restore dependencies - run: nuget restore Wpf.Ui.sln + run: dotnet restore src\Wpf.Ui.Extension\Wpf.Ui.Extension.csproj - name: Build the solution - run: msbuild src\Wpf.Ui.Extension\Wpf.Ui.Extension.csproj /t:Rebuild -p:Configuration=Release -p:RestorePackages=false -p:Platform="x64" -p:ProductArchitecture="amd64" -p:GITHUB_ACTIONS=True -p:LangVersion=8.0 + run: msbuild src\Wpf.Ui.Extension\Wpf.Ui.Extension.csproj /t:Rebuild + -p:Configuration=Release -p:RestorePackages=false + -p:Platform="x64" -p:ProductArchitecture="amd64" + -p:GITHUB_ACTIONS=True -p:LangVersion=8.0 - name: Build the solution - run: msbuild src\Wpf.Ui.Extension\Wpf.Ui.Extension.csproj /t:Rebuild -p:Configuration=Release -p:RestorePackages=false -p:Platform="arm64" -p:ProductArchitecture="arm64" -p:GITHUB_ACTIONS=True -p:LangVersion=8.0 + run: msbuild src\Wpf.Ui.Extension\Wpf.Ui.Extension.csproj /t:Rebuild + -p:Configuration=Release -p:RestorePackages=false -p:Platform="arm64" + -p:ProductArchitecture="arm64" -p:GITHUB_ACTIONS=True + -p:LangVersion=8.0 - uses: actions/upload-artifact@v4 with: diff --git a/Directory.Build.props b/Directory.Build.props index d37b05a15..a0a8d6b79 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -4,8 +4,8 @@ $(RepositoryDirectory)build\ - 4.2.1 - 4.2.0 + 5.0.0-preview.1 + 5.0.0 lepo.co diff --git a/Directory.Packages.props b/Directory.Packages.props index ae23b0048..074ca123e 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -36,6 +36,7 @@ + diff --git a/Wpf.Ui.Gallery.slnf b/Wpf.Ui.Gallery.slnf deleted file mode 100644 index e2bd4120d..000000000 --- a/Wpf.Ui.Gallery.slnf +++ /dev/null @@ -1,13 +0,0 @@ -{ - "solution": { - "path": "Wpf.Ui.sln", - "projects": [ - "src\\Wpf.Ui.Gallery.Package\\Wpf.Ui.Gallery.Package.wapproj", - "src\\Wpf.Ui.Gallery\\Wpf.Ui.Gallery.csproj", - "src\\Wpf.Ui.SyntaxHighlight\\Wpf.Ui.SyntaxHighlight.csproj", - "src\\Wpf.Ui.ToastNotifications\\Wpf.Ui.ToastNotifications.csproj", - "src\\Wpf.Ui.Tray\\Wpf.Ui.Tray.csproj", - "src\\Wpf.Ui\\Wpf.Ui.csproj" - ] - } -} \ No newline at end of file diff --git a/Wpf.Ui.Library.slnf b/Wpf.Ui.Library.slnf deleted file mode 100644 index 11b2921d4..000000000 --- a/Wpf.Ui.Library.slnf +++ /dev/null @@ -1,10 +0,0 @@ -{ - "solution": { - "path": "Wpf.Ui.sln", - "projects": [ - "src\\Wpf.Ui.ToastNotifications\\Wpf.Ui.ToastNotifications.csproj", - "src\\Wpf.Ui.Tray\\Wpf.Ui.Tray.csproj", - "src\\Wpf.Ui\\Wpf.Ui.csproj" - ] - } -} \ No newline at end of file diff --git a/Wpf.Ui.sln b/Wpf.Ui.sln deleted file mode 100644 index e90969047..000000000 --- a/Wpf.Ui.sln +++ /dev/null @@ -1,408 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 18 -VisualStudioVersion = 18.0.11201.2 d18.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{21DB16AA-40BB-428B-AFE8-DEF4E3F0DC49}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - Directory.Build.props = Directory.Build.props - Directory.Build.targets = Directory.Build.targets - Directory.Packages.props = Directory.Packages.props - LICENSE = LICENSE - LICENSE.md = LICENSE.md - nuget.config = nuget.config - README.md = README.md - Settings.XamlStyler = Settings.XamlStyler - ThirdPartyNotices.txt = ThirdPartyNotices.txt - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Gallery", "src\Wpf.Ui.Gallery\Wpf.Ui.Gallery.csproj", "{E55BFB14-9DA6-434A-8153-BFE124D71818}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui", "src\Wpf.Ui\Wpf.Ui.csproj", "{1ADC87D1-8963-4100-845A-18477824718E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.FontMapper", "src\Wpf.Ui.FontMapper\Wpf.Ui.FontMapper.csproj", "{50BAB8DE-6558-4E77-87E5-CD533CBBB72F}" -EndProject -Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "Wpf.Ui.Gallery.Package", "src\Wpf.Ui.Gallery.Package\Wpf.Ui.Gallery.Package.wapproj", "{50C713C3-555E-491F-87EE-C806BEC0579F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.UnitTests", "tests\Wpf.Ui.UnitTests\Wpf.Ui.UnitTests.csproj", "{AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{35AC6218-CBEA-4FDA-8CE1-D1EBD6FD8D4A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wpf.Ui.Extension", "src\Wpf.Ui.Extension\Wpf.Ui.Extension.csproj", "{1298D974-9D81-4A93-9374-EA6A0E723DEB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wpf.Ui.Extension.Template.Compact", "src\Wpf.Ui.Extension.Template.Compact\Wpf.Ui.Extension.Template.Compact.csproj", "{14D7431C-6CFF-4191-BB88-2B8D5F323A30}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wpf.Ui.Extension.Template.Blank", "src\Wpf.Ui.Extension.Template.Blank\Wpf.Ui.Extension.Template.Blank.csproj", "{AB3D44B5-9491-487E-A134-9AC5BED2B981}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wpf.Ui.Extension.Template.Fluent", "src\Wpf.Ui.Extension.Template.Fluent\Wpf.Ui.Extension.Template.Fluent.csproj", "{4D2706B5-27A9-4542-BD4D-8C22D12D0628}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.ToastNotifications", "src\Wpf.Ui.ToastNotifications\Wpf.Ui.ToastNotifications.csproj", "{3E84FE46-D3FD-4E8A-9208-95E315F16E1F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Tray", "src\Wpf.Ui.Tray\Wpf.Ui.Tray.csproj", "{073BF126-377B-49CD-838A-E8B779EB4862}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.SyntaxHighlight", "src\Wpf.Ui.SyntaxHighlight\Wpf.Ui.SyntaxHighlight.csproj", "{07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Abstractions", "src\Wpf.Ui.Abstractions\Wpf.Ui.Abstractions.csproj", "{F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{D7EA6A65-3CB5-4A59-934A-B8402C849107}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Demo.Console", "samples\Wpf.Ui.Demo.Console\Wpf.Ui.Demo.Console.csproj", "{6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Demo.Mvvm", "samples\Wpf.Ui.Demo.Mvvm\Wpf.Ui.Demo.Mvvm.csproj", "{5138077E-670E-413D-94D1-0825B6D1201B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Demo.Simple", "samples\Wpf.Ui.Demo.Simple\Wpf.Ui.Demo.Simple.csproj", "{E37CD05A-EBFC-429D-A550-BEE44119FA9E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Demo.Dialogs", "samples\Wpf.Ui.Demo.Dialogs\Wpf.Ui.Demo.Dialogs.csproj", "{7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wpf.Ui.DependencyInjection", "src\Wpf.Ui.DependencyInjection\Wpf.Ui.DependencyInjection.csproj", "{9C8D6133-9417-43A1-B54F-725009569D71}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wpf.Ui.Demo.SetResources.Simple", "samples\Wpf.Ui.Demo.SetResources.Simple\Wpf.Ui.Demo.SetResources.Simple.csproj", "{3B424CF4-09F8-47D3-8420-53D7A1165B9C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wpf.Ui.Gallery.IntegrationTests", "tests\Wpf.Ui.Gallery.IntegrationTests\Wpf.Ui.Gallery.IntegrationTests.csproj", "{A396F1D6-55CF-493E-B541-A50B8F29395A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wpf.Ui.FlaUI", "src\Wpf.Ui.FlaUI\Wpf.Ui.FlaUI.csproj", "{3E29F5F8-8310-45F4-A648-8F44F32B6472}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|arm64 = Debug|arm64 - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|arm64 = Release|arm64 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|arm64.ActiveCfg = Debug|arm64 - {E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|arm64.Build.0 = Debug|arm64 - {E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|x64.ActiveCfg = Debug|x64 - {E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|x64.Build.0 = Debug|x64 - {E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|x86.ActiveCfg = Debug|x86 - {E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|x86.Build.0 = Debug|x86 - {E55BFB14-9DA6-434A-8153-BFE124D71818}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E55BFB14-9DA6-434A-8153-BFE124D71818}.Release|Any CPU.Build.0 = Release|Any CPU - {E55BFB14-9DA6-434A-8153-BFE124D71818}.Release|arm64.ActiveCfg = Release|arm64 - {E55BFB14-9DA6-434A-8153-BFE124D71818}.Release|arm64.Build.0 = Release|arm64 - {E55BFB14-9DA6-434A-8153-BFE124D71818}.Release|x64.ActiveCfg = Release|x64 - {E55BFB14-9DA6-434A-8153-BFE124D71818}.Release|x64.Build.0 = Release|x64 - {E55BFB14-9DA6-434A-8153-BFE124D71818}.Release|x86.ActiveCfg = Release|x86 - {E55BFB14-9DA6-434A-8153-BFE124D71818}.Release|x86.Build.0 = Release|x86 - {1ADC87D1-8963-4100-845A-18477824718E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1ADC87D1-8963-4100-845A-18477824718E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1ADC87D1-8963-4100-845A-18477824718E}.Debug|arm64.ActiveCfg = Debug|Any CPU - {1ADC87D1-8963-4100-845A-18477824718E}.Debug|arm64.Build.0 = Debug|Any CPU - {1ADC87D1-8963-4100-845A-18477824718E}.Debug|x64.ActiveCfg = Debug|Any CPU - {1ADC87D1-8963-4100-845A-18477824718E}.Debug|x64.Build.0 = Debug|Any CPU - {1ADC87D1-8963-4100-845A-18477824718E}.Debug|x86.ActiveCfg = Debug|Any CPU - {1ADC87D1-8963-4100-845A-18477824718E}.Debug|x86.Build.0 = Debug|Any CPU - {1ADC87D1-8963-4100-845A-18477824718E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1ADC87D1-8963-4100-845A-18477824718E}.Release|Any CPU.Build.0 = Release|Any CPU - {1ADC87D1-8963-4100-845A-18477824718E}.Release|arm64.ActiveCfg = Release|Any CPU - {1ADC87D1-8963-4100-845A-18477824718E}.Release|arm64.Build.0 = Release|Any CPU - {1ADC87D1-8963-4100-845A-18477824718E}.Release|x64.ActiveCfg = Release|Any CPU - {1ADC87D1-8963-4100-845A-18477824718E}.Release|x64.Build.0 = Release|Any CPU - {1ADC87D1-8963-4100-845A-18477824718E}.Release|x86.ActiveCfg = Release|Any CPU - {1ADC87D1-8963-4100-845A-18477824718E}.Release|x86.Build.0 = Release|Any CPU - {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|arm64.ActiveCfg = Debug|Any CPU - {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|arm64.Build.0 = Debug|Any CPU - {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|x64.ActiveCfg = Debug|Any CPU - {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|x64.Build.0 = Debug|Any CPU - {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|x86.ActiveCfg = Debug|Any CPU - {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|x86.Build.0 = Debug|Any CPU - {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|Any CPU.Build.0 = Release|Any CPU - {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|arm64.ActiveCfg = Release|Any CPU - {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|arm64.Build.0 = Release|Any CPU - {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|x64.ActiveCfg = Release|Any CPU - {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|x64.Build.0 = Release|Any CPU - {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|x86.ActiveCfg = Release|Any CPU - {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|x86.Build.0 = Release|Any CPU - {50C713C3-555E-491F-87EE-C806BEC0579F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {50C713C3-555E-491F-87EE-C806BEC0579F}.Debug|arm64.ActiveCfg = Debug|ARM64 - {50C713C3-555E-491F-87EE-C806BEC0579F}.Debug|x64.ActiveCfg = Debug|x64 - {50C713C3-555E-491F-87EE-C806BEC0579F}.Debug|x86.ActiveCfg = Debug|x86 - {50C713C3-555E-491F-87EE-C806BEC0579F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {50C713C3-555E-491F-87EE-C806BEC0579F}.Release|arm64.ActiveCfg = Release|ARM64 - {50C713C3-555E-491F-87EE-C806BEC0579F}.Release|arm64.Build.0 = Release|ARM64 - {50C713C3-555E-491F-87EE-C806BEC0579F}.Release|arm64.Deploy.0 = Release|ARM64 - {50C713C3-555E-491F-87EE-C806BEC0579F}.Release|x64.ActiveCfg = Release|x64 - {50C713C3-555E-491F-87EE-C806BEC0579F}.Release|x64.Build.0 = Release|x64 - {50C713C3-555E-491F-87EE-C806BEC0579F}.Release|x64.Deploy.0 = Release|x64 - {50C713C3-555E-491F-87EE-C806BEC0579F}.Release|x86.ActiveCfg = Release|x86 - {50C713C3-555E-491F-87EE-C806BEC0579F}.Release|x86.Build.0 = Release|x86 - {50C713C3-555E-491F-87EE-C806BEC0579F}.Release|x86.Deploy.0 = Release|x86 - {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Debug|arm64.ActiveCfg = Debug|Any CPU - {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Debug|arm64.Build.0 = Debug|Any CPU - {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Debug|x64.ActiveCfg = Debug|Any CPU - {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Debug|x64.Build.0 = Debug|Any CPU - {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Debug|x86.ActiveCfg = Debug|Any CPU - {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Debug|x86.Build.0 = Debug|Any CPU - {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|Any CPU.Build.0 = Release|Any CPU - {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|arm64.ActiveCfg = Release|Any CPU - {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|arm64.Build.0 = Release|Any CPU - {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|x64.ActiveCfg = Release|Any CPU - {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|x64.Build.0 = Release|Any CPU - {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|x86.ActiveCfg = Release|Any CPU - {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|x86.Build.0 = Release|Any CPU - {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Debug|arm64.ActiveCfg = Debug|arm64 - {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Debug|x64.ActiveCfg = Debug|x64 - {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Debug|x86.ActiveCfg = Debug|x86 - {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|Any CPU.Build.0 = Release|Any CPU - {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|arm64.ActiveCfg = Release|arm64 - {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|arm64.Build.0 = Release|arm64 - {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|x64.ActiveCfg = Release|x64 - {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|x64.Build.0 = Release|x64 - {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|x86.ActiveCfg = Release|x86 - {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Debug|arm64.ActiveCfg = Debug|arm64 - {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Debug|x64.ActiveCfg = Debug|x64 - {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Debug|x86.ActiveCfg = Debug|x86 - {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Release|Any CPU.ActiveCfg = Release|Any CPU - {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Release|Any CPU.Build.0 = Release|Any CPU - {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Release|arm64.ActiveCfg = Release|arm64 - {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Release|arm64.Build.0 = Release|arm64 - {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Release|x64.ActiveCfg = Release|x64 - {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Release|x64.Build.0 = Release|x64 - {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Release|x86.ActiveCfg = Release|x86 - {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Debug|arm64.ActiveCfg = Debug|arm64 - {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Debug|x64.ActiveCfg = Debug|x64 - {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Debug|x86.ActiveCfg = Debug|x86 - {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Release|Any CPU.Build.0 = Release|Any CPU - {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Release|arm64.ActiveCfg = Release|arm64 - {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Release|arm64.Build.0 = Release|arm64 - {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Release|x64.ActiveCfg = Release|x64 - {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Release|x64.Build.0 = Release|x64 - {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Release|x86.ActiveCfg = Release|x86 - {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Debug|arm64.ActiveCfg = Debug|arm64 - {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Debug|x64.ActiveCfg = Debug|x64 - {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Debug|x86.ActiveCfg = Debug|x86 - {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Release|Any CPU.Build.0 = Release|Any CPU - {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Release|arm64.ActiveCfg = Release|arm64 - {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Release|arm64.Build.0 = Release|arm64 - {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Release|x64.ActiveCfg = Release|x64 - {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Release|x64.Build.0 = Release|x64 - {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Release|x86.ActiveCfg = Release|x86 - {3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Debug|arm64.ActiveCfg = Debug|Any CPU - {3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Debug|arm64.Build.0 = Debug|Any CPU - {3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Debug|x64.ActiveCfg = Debug|Any CPU - {3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Debug|x64.Build.0 = Debug|Any CPU - {3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Debug|x86.ActiveCfg = Debug|Any CPU - {3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Debug|x86.Build.0 = Debug|Any CPU - {3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Release|Any CPU.Build.0 = Release|Any CPU - {3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Release|arm64.ActiveCfg = Release|Any CPU - {3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Release|arm64.Build.0 = Release|Any CPU - {3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Release|x64.ActiveCfg = Release|Any CPU - {3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Release|x64.Build.0 = Release|Any CPU - {3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Release|x86.ActiveCfg = Release|Any CPU - {3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Release|x86.Build.0 = Release|Any CPU - {073BF126-377B-49CD-838A-E8B779EB4862}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {073BF126-377B-49CD-838A-E8B779EB4862}.Debug|Any CPU.Build.0 = Debug|Any CPU - {073BF126-377B-49CD-838A-E8B779EB4862}.Debug|arm64.ActiveCfg = Debug|Any CPU - {073BF126-377B-49CD-838A-E8B779EB4862}.Debug|arm64.Build.0 = Debug|Any CPU - {073BF126-377B-49CD-838A-E8B779EB4862}.Debug|x64.ActiveCfg = Debug|Any CPU - {073BF126-377B-49CD-838A-E8B779EB4862}.Debug|x64.Build.0 = Debug|Any CPU - {073BF126-377B-49CD-838A-E8B779EB4862}.Debug|x86.ActiveCfg = Debug|Any CPU - {073BF126-377B-49CD-838A-E8B779EB4862}.Debug|x86.Build.0 = Debug|Any CPU - {073BF126-377B-49CD-838A-E8B779EB4862}.Release|Any CPU.ActiveCfg = Release|Any CPU - {073BF126-377B-49CD-838A-E8B779EB4862}.Release|Any CPU.Build.0 = Release|Any CPU - {073BF126-377B-49CD-838A-E8B779EB4862}.Release|arm64.ActiveCfg = Release|Any CPU - {073BF126-377B-49CD-838A-E8B779EB4862}.Release|arm64.Build.0 = Release|Any CPU - {073BF126-377B-49CD-838A-E8B779EB4862}.Release|x64.ActiveCfg = Release|Any CPU - {073BF126-377B-49CD-838A-E8B779EB4862}.Release|x64.Build.0 = Release|Any CPU - {073BF126-377B-49CD-838A-E8B779EB4862}.Release|x86.ActiveCfg = Release|Any CPU - {073BF126-377B-49CD-838A-E8B779EB4862}.Release|x86.Build.0 = Release|Any CPU - {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Debug|arm64.ActiveCfg = Debug|Any CPU - {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Debug|arm64.Build.0 = Debug|Any CPU - {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Debug|x64.ActiveCfg = Debug|Any CPU - {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Debug|x64.Build.0 = Debug|Any CPU - {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Debug|x86.ActiveCfg = Debug|Any CPU - {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Debug|x86.Build.0 = Debug|Any CPU - {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Release|Any CPU.Build.0 = Release|Any CPU - {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Release|arm64.ActiveCfg = Release|Any CPU - {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Release|arm64.Build.0 = Release|Any CPU - {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Release|x64.ActiveCfg = Release|Any CPU - {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Release|x64.Build.0 = Release|Any CPU - {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Release|x86.ActiveCfg = Release|Any CPU - {07F7A65A-6061-4606-ACA2-F8D1A3D0E19A}.Release|x86.Build.0 = Release|Any CPU - {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Debug|arm64.ActiveCfg = Debug|Any CPU - {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Debug|arm64.Build.0 = Debug|Any CPU - {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Debug|x64.ActiveCfg = Debug|Any CPU - {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Debug|x64.Build.0 = Debug|Any CPU - {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Debug|x86.ActiveCfg = Debug|Any CPU - {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Debug|x86.Build.0 = Debug|Any CPU - {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Release|Any CPU.Build.0 = Release|Any CPU - {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Release|arm64.ActiveCfg = Release|Any CPU - {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Release|arm64.Build.0 = Release|Any CPU - {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Release|x64.ActiveCfg = Release|Any CPU - {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Release|x64.Build.0 = Release|Any CPU - {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Release|x86.ActiveCfg = Release|Any CPU - {F3A0BD51-2B8C-4E75-A64B-0AED46A22F74}.Release|x86.Build.0 = Release|Any CPU - {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Debug|arm64.ActiveCfg = Debug|Any CPU - {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Debug|arm64.Build.0 = Debug|Any CPU - {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Debug|x64.ActiveCfg = Debug|Any CPU - {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Debug|x64.Build.0 = Debug|Any CPU - {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Debug|x86.ActiveCfg = Debug|Any CPU - {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Debug|x86.Build.0 = Debug|Any CPU - {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Release|Any CPU.Build.0 = Release|Any CPU - {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Release|arm64.ActiveCfg = Release|Any CPU - {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Release|arm64.Build.0 = Release|Any CPU - {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Release|x64.ActiveCfg = Release|Any CPU - {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Release|x64.Build.0 = Release|Any CPU - {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Release|x86.ActiveCfg = Release|Any CPU - {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA}.Release|x86.Build.0 = Release|Any CPU - {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|arm64.ActiveCfg = Debug|Any CPU - {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|arm64.Build.0 = Debug|Any CPU - {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|x64.ActiveCfg = Debug|Any CPU - {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|x64.Build.0 = Debug|Any CPU - {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|x86.ActiveCfg = Debug|Any CPU - {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|x86.Build.0 = Debug|Any CPU - {5138077E-670E-413D-94D1-0825B6D1201B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5138077E-670E-413D-94D1-0825B6D1201B}.Release|Any CPU.Build.0 = Release|Any CPU - {5138077E-670E-413D-94D1-0825B6D1201B}.Release|arm64.ActiveCfg = Release|Any CPU - {5138077E-670E-413D-94D1-0825B6D1201B}.Release|arm64.Build.0 = Release|Any CPU - {5138077E-670E-413D-94D1-0825B6D1201B}.Release|x64.ActiveCfg = Release|Any CPU - {5138077E-670E-413D-94D1-0825B6D1201B}.Release|x64.Build.0 = Release|Any CPU - {5138077E-670E-413D-94D1-0825B6D1201B}.Release|x86.ActiveCfg = Release|Any CPU - {5138077E-670E-413D-94D1-0825B6D1201B}.Release|x86.Build.0 = Release|Any CPU - {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|arm64.ActiveCfg = Debug|Any CPU - {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|arm64.Build.0 = Debug|Any CPU - {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|x64.ActiveCfg = Debug|Any CPU - {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|x64.Build.0 = Debug|Any CPU - {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|x86.ActiveCfg = Debug|Any CPU - {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|x86.Build.0 = Debug|Any CPU - {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|Any CPU.Build.0 = Release|Any CPU - {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|arm64.ActiveCfg = Release|Any CPU - {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|arm64.Build.0 = Release|Any CPU - {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|x64.ActiveCfg = Release|Any CPU - {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|x64.Build.0 = Release|Any CPU - {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|x86.ActiveCfg = Release|Any CPU - {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|x86.Build.0 = Release|Any CPU - {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Debug|arm64.ActiveCfg = Debug|Any CPU - {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Debug|arm64.Build.0 = Debug|Any CPU - {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Debug|x64.ActiveCfg = Debug|Any CPU - {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Debug|x64.Build.0 = Debug|Any CPU - {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Debug|x86.ActiveCfg = Debug|Any CPU - {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Debug|x86.Build.0 = Debug|Any CPU - {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Release|Any CPU.Build.0 = Release|Any CPU - {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Release|arm64.ActiveCfg = Release|Any CPU - {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Release|arm64.Build.0 = Release|Any CPU - {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Release|x64.ActiveCfg = Release|Any CPU - {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Release|x64.Build.0 = Release|Any CPU - {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Release|x86.ActiveCfg = Release|Any CPU - {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Release|x86.Build.0 = Release|Any CPU - {9C8D6133-9417-43A1-B54F-725009569D71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9C8D6133-9417-43A1-B54F-725009569D71}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9C8D6133-9417-43A1-B54F-725009569D71}.Debug|arm64.ActiveCfg = Debug|Any CPU - {9C8D6133-9417-43A1-B54F-725009569D71}.Debug|arm64.Build.0 = Debug|Any CPU - {9C8D6133-9417-43A1-B54F-725009569D71}.Debug|x64.ActiveCfg = Debug|Any CPU - {9C8D6133-9417-43A1-B54F-725009569D71}.Debug|x64.Build.0 = Debug|Any CPU - {9C8D6133-9417-43A1-B54F-725009569D71}.Debug|x86.ActiveCfg = Debug|Any CPU - {9C8D6133-9417-43A1-B54F-725009569D71}.Debug|x86.Build.0 = Debug|Any CPU - {9C8D6133-9417-43A1-B54F-725009569D71}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9C8D6133-9417-43A1-B54F-725009569D71}.Release|Any CPU.Build.0 = Release|Any CPU - {9C8D6133-9417-43A1-B54F-725009569D71}.Release|arm64.ActiveCfg = Release|Any CPU - {9C8D6133-9417-43A1-B54F-725009569D71}.Release|arm64.Build.0 = Release|Any CPU - {9C8D6133-9417-43A1-B54F-725009569D71}.Release|x64.ActiveCfg = Release|Any CPU - {9C8D6133-9417-43A1-B54F-725009569D71}.Release|x64.Build.0 = Release|Any CPU - {9C8D6133-9417-43A1-B54F-725009569D71}.Release|x86.ActiveCfg = Release|Any CPU - {9C8D6133-9417-43A1-B54F-725009569D71}.Release|x86.Build.0 = Release|Any CPU - {3B424CF4-09F8-47D3-8420-53D7A1165B9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3B424CF4-09F8-47D3-8420-53D7A1165B9C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3B424CF4-09F8-47D3-8420-53D7A1165B9C}.Debug|arm64.ActiveCfg = Debug|Any CPU - {3B424CF4-09F8-47D3-8420-53D7A1165B9C}.Debug|arm64.Build.0 = Debug|Any CPU - {3B424CF4-09F8-47D3-8420-53D7A1165B9C}.Debug|x64.ActiveCfg = Debug|Any CPU - {3B424CF4-09F8-47D3-8420-53D7A1165B9C}.Debug|x64.Build.0 = Debug|Any CPU - {3B424CF4-09F8-47D3-8420-53D7A1165B9C}.Debug|x86.ActiveCfg = Debug|Any CPU - {3B424CF4-09F8-47D3-8420-53D7A1165B9C}.Debug|x86.Build.0 = Debug|Any CPU - {3B424CF4-09F8-47D3-8420-53D7A1165B9C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3B424CF4-09F8-47D3-8420-53D7A1165B9C}.Release|Any CPU.Build.0 = Release|Any CPU - {3B424CF4-09F8-47D3-8420-53D7A1165B9C}.Release|arm64.ActiveCfg = Release|Any CPU - {3B424CF4-09F8-47D3-8420-53D7A1165B9C}.Release|arm64.Build.0 = Release|Any CPU - {3B424CF4-09F8-47D3-8420-53D7A1165B9C}.Release|x64.ActiveCfg = Release|Any CPU - {3B424CF4-09F8-47D3-8420-53D7A1165B9C}.Release|x64.Build.0 = Release|Any CPU - {3B424CF4-09F8-47D3-8420-53D7A1165B9C}.Release|x86.ActiveCfg = Release|Any CPU - {3B424CF4-09F8-47D3-8420-53D7A1165B9C}.Release|x86.Build.0 = Release|Any CPU - {A396F1D6-55CF-493E-B541-A50B8F29395A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A396F1D6-55CF-493E-B541-A50B8F29395A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A396F1D6-55CF-493E-B541-A50B8F29395A}.Debug|arm64.ActiveCfg = Debug|Any CPU - {A396F1D6-55CF-493E-B541-A50B8F29395A}.Debug|arm64.Build.0 = Debug|Any CPU - {A396F1D6-55CF-493E-B541-A50B8F29395A}.Debug|x64.ActiveCfg = Debug|Any CPU - {A396F1D6-55CF-493E-B541-A50B8F29395A}.Debug|x64.Build.0 = Debug|Any CPU - {A396F1D6-55CF-493E-B541-A50B8F29395A}.Debug|x86.ActiveCfg = Debug|Any CPU - {A396F1D6-55CF-493E-B541-A50B8F29395A}.Debug|x86.Build.0 = Debug|Any CPU - {A396F1D6-55CF-493E-B541-A50B8F29395A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A396F1D6-55CF-493E-B541-A50B8F29395A}.Release|Any CPU.Build.0 = Release|Any CPU - {A396F1D6-55CF-493E-B541-A50B8F29395A}.Release|arm64.ActiveCfg = Release|Any CPU - {A396F1D6-55CF-493E-B541-A50B8F29395A}.Release|arm64.Build.0 = Release|Any CPU - {A396F1D6-55CF-493E-B541-A50B8F29395A}.Release|x64.ActiveCfg = Release|Any CPU - {A396F1D6-55CF-493E-B541-A50B8F29395A}.Release|x64.Build.0 = Release|Any CPU - {A396F1D6-55CF-493E-B541-A50B8F29395A}.Release|x86.ActiveCfg = Release|Any CPU - {A396F1D6-55CF-493E-B541-A50B8F29395A}.Release|x86.Build.0 = Release|Any CPU - {3E29F5F8-8310-45F4-A648-8F44F32B6472}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3E29F5F8-8310-45F4-A648-8F44F32B6472}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3E29F5F8-8310-45F4-A648-8F44F32B6472}.Debug|arm64.ActiveCfg = Debug|Any CPU - {3E29F5F8-8310-45F4-A648-8F44F32B6472}.Debug|arm64.Build.0 = Debug|Any CPU - {3E29F5F8-8310-45F4-A648-8F44F32B6472}.Debug|x64.ActiveCfg = Debug|Any CPU - {3E29F5F8-8310-45F4-A648-8F44F32B6472}.Debug|x64.Build.0 = Debug|Any CPU - {3E29F5F8-8310-45F4-A648-8F44F32B6472}.Debug|x86.ActiveCfg = Debug|Any CPU - {3E29F5F8-8310-45F4-A648-8F44F32B6472}.Debug|x86.Build.0 = Debug|Any CPU - {3E29F5F8-8310-45F4-A648-8F44F32B6472}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3E29F5F8-8310-45F4-A648-8F44F32B6472}.Release|Any CPU.Build.0 = Release|Any CPU - {3E29F5F8-8310-45F4-A648-8F44F32B6472}.Release|arm64.ActiveCfg = Release|Any CPU - {3E29F5F8-8310-45F4-A648-8F44F32B6472}.Release|arm64.Build.0 = Release|Any CPU - {3E29F5F8-8310-45F4-A648-8F44F32B6472}.Release|x64.ActiveCfg = Release|Any CPU - {3E29F5F8-8310-45F4-A648-8F44F32B6472}.Release|x64.Build.0 = Release|Any CPU - {3E29F5F8-8310-45F4-A648-8F44F32B6472}.Release|x86.ActiveCfg = Release|Any CPU - {3E29F5F8-8310-45F4-A648-8F44F32B6472}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C} = {35AC6218-CBEA-4FDA-8CE1-D1EBD6FD8D4A} - {6F1F6A8D-A530-4C4F-9360-219AC3B43FAA} = {D7EA6A65-3CB5-4A59-934A-B8402C849107} - {5138077E-670E-413D-94D1-0825B6D1201B} = {D7EA6A65-3CB5-4A59-934A-B8402C849107} - {E37CD05A-EBFC-429D-A550-BEE44119FA9E} = {D7EA6A65-3CB5-4A59-934A-B8402C849107} - {7F6C7E7A-A4B5-4D12-88EB-217CA59284F4} = {D7EA6A65-3CB5-4A59-934A-B8402C849107} - {3B424CF4-09F8-47D3-8420-53D7A1165B9C} = {D7EA6A65-3CB5-4A59-934A-B8402C849107} - {A396F1D6-55CF-493E-B541-A50B8F29395A} = {35AC6218-CBEA-4FDA-8CE1-D1EBD6FD8D4A} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {234CB3F9-5ADC-433F-BDBD-CB8EA59EB518} - EndGlobalSection -EndGlobal diff --git a/Wpf.Ui.sln.DotSettings b/Wpf.Ui.sln.DotSettings new file mode 100644 index 000000000..5541e3cbd --- /dev/null +++ b/Wpf.Ui.sln.DotSettings @@ -0,0 +1,3 @@ + + True + True \ No newline at end of file diff --git a/Wpf.Ui.slnx b/Wpf.Ui.slnx new file mode 100644 index 000000000..afac253d6 --- /dev/null +++ b/Wpf.Ui.slnx @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build.ps1 b/build.ps1 index de2b25257..9a203e2f7 100644 --- a/build.ps1 +++ b/build.ps1 @@ -29,7 +29,7 @@ if ($dotnetVersion -eq $null) { } if ($env:PROCESSOR_ARCHITECTURE -eq "AMD64") { - dotnet restore Wpf.Ui.sln /tl + dotnet restore Wpf.Ui.slnx /tl dotnet build src\Wpf.Ui.Gallery\Wpf.Ui.Gallery.csproj --configuration Release --no-restore --verbosity quiet /tl } else { Write-Host "Not in the x64 desktop environment." diff --git a/docs/index.md b/docs/index.md index ce4808e75..05ea26e2b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -115,7 +115,7 @@ To ensure you receive the expert guidance you need, we offer a variety of suppor Sponsor WPF UI on GitHub - + ![Demo App Sample](https://user-images.githubusercontent.com/13592821/166259110-0fb98120-fe34-4e6d-ab92-9f72ad7113c3.png) ![Monaco Editor](https://user-images.githubusercontent.com/13592821/258610583-7d71f69d-45b3-4be6-bcb8-8cf6cd60a2ff.png) diff --git a/samples/Wpf.Ui.Demo.Dialogs/MainWindow.xaml.cs b/samples/Wpf.Ui.Demo.Dialogs/MainWindow.xaml.cs index 19ae1288a..9ecbf560f 100644 --- a/samples/Wpf.Ui.Demo.Dialogs/MainWindow.xaml.cs +++ b/samples/Wpf.Ui.Demo.Dialogs/MainWindow.xaml.cs @@ -24,10 +24,10 @@ private async void OnShowDialogClick(object sender, RoutedEventArgs e) await Application.Current.Dispatcher.InvokeAsync(ShowSampleDialogAsync); } - private async Task ShowSampleDialogAsync() + private Task ShowSampleDialogAsync() { // Defining dialog object - ContentDialog myDialog = new() + var myDialog = new ContentDialog { Title = "My sample dialog", Content = "Content of the dialog", @@ -40,6 +40,6 @@ private async Task ShowSampleDialogAsync() myDialog.DialogHost = ContentPresenterForDialogs; // Showing the dialog - await myDialog.ShowAsync(CancellationToken.None); + return myDialog.ShowAsync(CancellationToken.None); } } diff --git a/samples/Wpf.Ui.Demo.Mvvm/ViewModels/DataViewModel.cs b/samples/Wpf.Ui.Demo.Mvvm/ViewModels/DataViewModel.cs index 8c941576f..7552762fd 100644 --- a/samples/Wpf.Ui.Demo.Mvvm/ViewModels/DataViewModel.cs +++ b/samples/Wpf.Ui.Demo.Mvvm/ViewModels/DataViewModel.cs @@ -15,7 +15,7 @@ public partial class DataViewModel : ViewModel [ObservableProperty] private List _colors = []; - public override void OnNavigatedTo() + public override void OnNavigatedTo(CancellationToken cancellationToken = default) { if (!_isInitialized) { diff --git a/samples/Wpf.Ui.Demo.Mvvm/ViewModels/SettingsViewModel.cs b/samples/Wpf.Ui.Demo.Mvvm/ViewModels/SettingsViewModel.cs index 5b6faa818..dac45d4af 100644 --- a/samples/Wpf.Ui.Demo.Mvvm/ViewModels/SettingsViewModel.cs +++ b/samples/Wpf.Ui.Demo.Mvvm/ViewModels/SettingsViewModel.cs @@ -18,7 +18,7 @@ public partial class SettingsViewModel : ViewModel .ApplicationTheme .Unknown; - public override void OnNavigatedTo() + public override void OnNavigatedTo(CancellationToken cancellationToken = default) { if (!_isInitialized) { diff --git a/samples/Wpf.Ui.Demo.Mvvm/ViewModels/ViewModel.cs b/samples/Wpf.Ui.Demo.Mvvm/ViewModels/ViewModel.cs index b96b71e2f..6e8c8aeec 100644 --- a/samples/Wpf.Ui.Demo.Mvvm/ViewModels/ViewModel.cs +++ b/samples/Wpf.Ui.Demo.Mvvm/ViewModels/ViewModel.cs @@ -10,30 +10,30 @@ namespace Wpf.Ui.Demo.Mvvm.ViewModels; public abstract class ViewModel : ObservableObject, INavigationAware { /// - public virtual Task OnNavigatedToAsync() + public virtual ValueTask OnNavigatedToAsync(CancellationToken cancellationToken = default) { - OnNavigatedTo(); + OnNavigatedTo(cancellationToken); - return Task.CompletedTask; + return default; } /// /// Handles the event that is fired after the component is navigated to. /// // ReSharper disable once MemberCanBeProtected.Global - public virtual void OnNavigatedTo() { } + public virtual void OnNavigatedTo(CancellationToken cancellationToken = default) { } /// - public virtual Task OnNavigatedFromAsync() + public virtual ValueTask OnNavigatedFromAsync(CancellationToken cancellationToken = default) { - OnNavigatedFrom(); + OnNavigatedFrom(cancellationToken); - return Task.CompletedTask; + return default; } /// /// Handles the event that is fired before the component is navigated from. /// // ReSharper disable once MemberCanBeProtected.Global - public virtual void OnNavigatedFrom() { } + public virtual void OnNavigatedFrom(CancellationToken cancellationToken = default) { } } diff --git a/samples/Wpf.Ui.Demo.Mvvm/Views/MainWindow.xaml b/samples/Wpf.Ui.Demo.Mvvm/Views/MainWindow.xaml index d9a83cf53..93f061f22 100644 --- a/samples/Wpf.Ui.Demo.Mvvm/Views/MainWindow.xaml +++ b/samples/Wpf.Ui.Demo.Mvvm/Views/MainWindow.xaml @@ -38,6 +38,8 @@ diff --git a/samples/Wpf.Ui.Demo.Simple/MainWindow.xaml b/samples/Wpf.Ui.Demo.Simple/MainWindow.xaml index ba09c4e6e..4c4cbef40 100644 --- a/samples/Wpf.Ui.Demo.Simple/MainWindow.xaml +++ b/samples/Wpf.Ui.Demo.Simple/MainWindow.xaml @@ -34,7 +34,10 @@ - + diff --git a/src/Wpf.Ui.Abstractions/Controls/INavigationAware.cs b/src/Wpf.Ui.Abstractions/Controls/INavigationAware.cs index 8f9a087cb..81d520712 100644 --- a/src/Wpf.Ui.Abstractions/Controls/INavigationAware.cs +++ b/src/Wpf.Ui.Abstractions/Controls/INavigationAware.cs @@ -3,6 +3,8 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System.Threading; + namespace Wpf.Ui.Abstractions.Controls; /// @@ -14,11 +16,11 @@ public interface INavigationAware /// Asynchronously handles the event that is fired after the component is navigated to. /// /// A task that represents the asynchronous operation. - Task OnNavigatedToAsync(); + ValueTask OnNavigatedToAsync(CancellationToken cancellationToken = default); /// /// Asynchronously handles the event that is fired before the component is navigated from. /// /// A task that represents the asynchronous operation. - Task OnNavigatedFromAsync(); + ValueTask OnNavigatedFromAsync(CancellationToken cancellationToken = default); } diff --git a/src/Wpf.Ui.Abstractions/Controls/NavigationAware.cs b/src/Wpf.Ui.Abstractions/Controls/NavigationAware.cs index 2c371d80f..66fa2b61c 100644 --- a/src/Wpf.Ui.Abstractions/Controls/NavigationAware.cs +++ b/src/Wpf.Ui.Abstractions/Controls/NavigationAware.cs @@ -3,6 +3,8 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System.Threading; + namespace Wpf.Ui.Abstractions.Controls; /// @@ -11,30 +13,40 @@ namespace Wpf.Ui.Abstractions.Controls; public abstract class NavigationAware : INavigationAware { /// - public virtual Task OnNavigatedToAsync() + public virtual ValueTask OnNavigatedToAsync(CancellationToken cancellationToken = default) { - OnNavigatedTo(); + if (cancellationToken.IsCancellationRequested) + { + return default; + } + + OnNavigatedTo(cancellationToken); - return Task.CompletedTask; + return default; } /// /// Handles the event that is fired after the component is navigated to. /// // ReSharper disable once MemberCanBeProtected.Global - public virtual void OnNavigatedTo() { } + public virtual void OnNavigatedTo(CancellationToken cancellationToken = default) { } /// - public virtual Task OnNavigatedFromAsync() + public virtual ValueTask OnNavigatedFromAsync(CancellationToken cancellationToken = default) { - OnNavigatedFrom(); + if (cancellationToken.IsCancellationRequested) + { + return default; + } + + OnNavigatedFrom(cancellationToken); - return Task.CompletedTask; + return default; } /// /// Handles the event that is fired before the component is navigated from. /// // ReSharper disable once MemberCanBeProtected.Global - public virtual void OnNavigatedFrom() { } + public virtual void OnNavigatedFrom(CancellationToken cancellationToken = default) { } } diff --git a/src/Wpf.Ui.Abstractions/Wpf.Ui.Abstractions.csproj b/src/Wpf.Ui.Abstractions/Wpf.Ui.Abstractions.csproj index 213ce3c9d..4f26a6bf9 100644 --- a/src/Wpf.Ui.Abstractions/Wpf.Ui.Abstractions.csproj +++ b/src/Wpf.Ui.Abstractions/Wpf.Ui.Abstractions.csproj @@ -9,6 +9,14 @@ <_SilenceIsAotCompatibleUnsupportedWarning>true + + + + diff --git a/src/Wpf.Ui.Extension.Template.Compact/ViewModels/Pages/DataViewModel.cs b/src/Wpf.Ui.Extension.Template.Compact/ViewModels/Pages/DataViewModel.cs index fc5225155..78ef6636b 100644 --- a/src/Wpf.Ui.Extension.Template.Compact/ViewModels/Pages/DataViewModel.cs +++ b/src/Wpf.Ui.Extension.Template.Compact/ViewModels/Pages/DataViewModel.cs @@ -11,7 +11,7 @@ public partial class DataViewModel : ObservableObject, INavigationAware [ObservableProperty] private IEnumerable _colors; - public Task OnNavigatedToAsync() + public ValueTask OnNavigatedToAsync() { if (!_isInitialized) InitializeViewModel(); @@ -19,7 +19,7 @@ public Task OnNavigatedToAsync() return Task.CompletedTask; } - public Task OnNavigatedFromAsync() => Task.CompletedTask; + public ValueTask OnNavigatedFromAsync() => Task.CompletedTask; private void InitializeViewModel() { diff --git a/src/Wpf.Ui.Extension.Template.Compact/Wpf.Ui.Compact.csproj b/src/Wpf.Ui.Extension.Template.Compact/Wpf.Ui.Compact.csproj index ab8dabeac..385a60c59 100644 --- a/src/Wpf.Ui.Extension.Template.Compact/Wpf.Ui.Compact.csproj +++ b/src/Wpf.Ui.Extension.Template.Compact/Wpf.Ui.Compact.csproj @@ -15,8 +15,8 @@ - - + + diff --git a/src/Wpf.Ui.Gallery/Controllers/MonacoController.cs b/src/Wpf.Ui.Gallery/Controllers/MonacoController.cs index b6a51231a..4a9c61fbd 100644 --- a/src/Wpf.Ui.Gallery/Controllers/MonacoController.cs +++ b/src/Wpf.Ui.Gallery/Controllers/MonacoController.cs @@ -10,22 +10,15 @@ namespace Wpf.Ui.Gallery.Controllers; -public class MonacoController +public class MonacoController(WebView2 webView) { private const string EditorContainerSelector = "#root"; private const string EditorObject = "wpfUiMonacoEditor"; - private readonly WebView2 _webView; - - public MonacoController(WebView2 webView) + public Task CreateAsync() { - _webView = webView; - } - - public async Task CreateAsync() - { - _ = await _webView.ExecuteScriptAsync( + return webView.ExecuteScriptAsync( $$""" const {{EditorObject}} = monaco.editor.create(document.querySelector('{{EditorContainerSelector}}')); window.onresize = () => {{{EditorObject}}.layout();} @@ -33,13 +26,13 @@ public async Task CreateAsync() ); } - public async Task SetThemeAsync(ApplicationTheme appApplicationTheme) + public Task SetThemeAsync(ApplicationTheme appApplicationTheme) { // TODO: Parse theme from object const string uiThemeName = "wpf-ui-app-theme"; var baseMonacoTheme = appApplicationTheme == ApplicationTheme.Light ? "vs" : "vs-dark"; - _ = await _webView.ExecuteScriptAsync( + return webView.ExecuteScriptAsync( $$$""" monaco.editor.defineTheme('{{{uiThemeName}}}', { base: '{{{baseMonacoTheme}}}', @@ -51,32 +44,30 @@ public async Task SetThemeAsync(ApplicationTheme appApplicationTheme) ); } - public async Task SetLanguageAsync(MonacoLanguage monacoLanguage) + public Task SetLanguageAsync(MonacoLanguage monacoLanguage) { var languageId = monacoLanguage == MonacoLanguage.ObjectiveC ? "objective-c" : monacoLanguage.ToString().ToLower(); - _ = await _webView.ExecuteScriptAsync( + return webView.ExecuteScriptAsync( "monaco.editor.setModelLanguage(" + EditorObject + $".getModel(), \"{languageId}\");" ); } - public async Task SetContentAsync(string contents) + public Task SetContentAsync(string contents) { var literalContents = SymbolDisplay.FormatLiteral(contents, false); - _ = await _webView.ExecuteScriptAsync(EditorObject + $".setValue(\"{literalContents}\");"); + return webView.ExecuteScriptAsync(EditorObject + $".setValue(\"{literalContents}\");"); } public void DispatchScript(string script) { - if (_webView == null) + if (webView == null) { return; } - _ = Application.Current.Dispatcher.InvokeAsync(async () => - await _webView!.ExecuteScriptAsync(script) - ); + _ = Application.Current.Dispatcher.InvokeAsync(async () => await webView!.ExecuteScriptAsync(script)); } } diff --git a/src/Wpf.Ui.Gallery/ViewModels/Pages/SettingsViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/Pages/SettingsViewModel.cs index b3c693d58..ecdd219b5 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/Pages/SettingsViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/Pages/SettingsViewModel.cs @@ -23,7 +23,7 @@ public sealed partial class SettingsViewModel(INavigationService navigationServi private NavigationViewPaneDisplayMode _currentApplicationNavigationStyle = NavigationViewPaneDisplayMode.Left; - public override void OnNavigatedTo() + public override void OnNavigatedTo(CancellationToken cancellationToken = default) { if (!_isInitialized) { diff --git a/src/Wpf.Ui.Gallery/ViewModels/ViewModel.cs b/src/Wpf.Ui.Gallery/ViewModels/ViewModel.cs index d82d5a5e3..e8ec20af5 100644 --- a/src/Wpf.Ui.Gallery/ViewModels/ViewModel.cs +++ b/src/Wpf.Ui.Gallery/ViewModels/ViewModel.cs @@ -8,30 +8,30 @@ namespace Wpf.Ui.Gallery.ViewModels; public abstract partial class ViewModel : ObservableObject, INavigationAware { /// - public virtual Task OnNavigatedToAsync() + public virtual ValueTask OnNavigatedToAsync(CancellationToken cancellationToken = default) { - OnNavigatedTo(); + OnNavigatedTo(cancellationToken); - return Task.CompletedTask; + return default; } /// /// Handles the event that is fired after the component is navigated to. /// // ReSharper disable once MemberCanBeProtected.Global - public virtual void OnNavigatedTo() { } + public virtual void OnNavigatedTo(CancellationToken cancellationToken = default) { } /// - public virtual Task OnNavigatedFromAsync() + public virtual ValueTask OnNavigatedFromAsync(CancellationToken cancellationToken = default) { - OnNavigatedFrom(); + OnNavigatedFrom(cancellationToken); - return Task.CompletedTask; + return default; } /// /// Handles the event that is fired before the component is navigated from. /// // ReSharper disable once MemberCanBeProtected.Global - public virtual void OnNavigatedFrom() { } + public virtual void OnNavigatedFrom(CancellationToken cancellationToken = default) { } } diff --git a/src/Wpf.Ui.Gallery/Views/Pages/Navigation/NavigationViewPage.xaml b/src/Wpf.Ui.Gallery/Views/Pages/Navigation/NavigationViewPage.xaml index a772a3279..f42c3db28 100644 --- a/src/Wpf.Ui.Gallery/Views/Pages/Navigation/NavigationViewPage.xaml +++ b/src/Wpf.Ui.Gallery/Views/Pages/Navigation/NavigationViewPage.xaml @@ -30,6 +30,8 @@ Margin="0" IsBackButtonVisible="Auto" IsPaneToggleVisible="True" + IsFooterSeparatorVisible="False" + IsTopSeparatorVisible="False" PaneDisplayMode="Left" PaneTitle="Pane Title"> @@ -109,6 +111,8 @@ Margin="0" IsBackButtonVisible="Collapsed" IsPaneToggleVisible="False" + IsFooterSeparatorVisible="False" + IsTopSeparatorVisible="False" PaneDisplayMode="LeftFluent"> - + diff --git a/src/Wpf.Ui/Controls/NavigationView/NavigationView.Properties.cs b/src/Wpf.Ui/Controls/NavigationView/NavigationView.Properties.cs index 43086aa16..912a73ab0 100644 --- a/src/Wpf.Ui/Controls/NavigationView/NavigationView.Properties.cs +++ b/src/Wpf.Ui/Controls/NavigationView/NavigationView.Properties.cs @@ -92,7 +92,7 @@ public partial class NavigationView nameof(IsTopSeparatorVisible), typeof(bool), typeof(NavigationView), - new FrameworkPropertyMetadata(true) + new FrameworkPropertyMetadata(false) ); /// Identifies the dependency property. @@ -100,7 +100,7 @@ public partial class NavigationView nameof(IsFooterSeparatorVisible), typeof(bool), typeof(NavigationView), - new FrameworkPropertyMetadata(true) + new FrameworkPropertyMetadata(false) ); /// Identifies the dependency property. diff --git a/src/Wpf.Ui/Controls/NavigationView/NavigationViewContentPresenter.cs b/src/Wpf.Ui/Controls/NavigationView/NavigationViewContentPresenter.cs index a2279d5ad..d5c3d022e 100644 --- a/src/Wpf.Ui/Controls/NavigationView/NavigationViewContentPresenter.cs +++ b/src/Wpf.Ui/Controls/NavigationView/NavigationViewContentPresenter.cs @@ -136,7 +136,7 @@ protected override void OnInitialized(EventArgs e) { if (sender is NavigationViewContentPresenter navigator) { - NotifyContentAboutNavigatingFrom(navigator.Content); + ObserveValueTask(NotifyContentAboutNavigatingFrom(navigator.Content)); } }; } @@ -163,19 +163,25 @@ protected override void OnPreviewKeyDown(KeyEventArgs e) base.OnPreviewKeyDown(e); } - protected virtual void OnNavigating(System.Windows.Navigation.NavigatingCancelEventArgs eventArgs) + protected virtual void OnNavigating( + System.Windows.Navigation.NavigatingCancelEventArgs eventArgs, + CancellationToken cancellationToken = default + ) { - NotifyContentAboutNavigatingTo(eventArgs.Content); + ObserveValueTask(NotifyContentAboutNavigatingTo(eventArgs.Content, cancellationToken)); if (eventArgs.Navigator is not NavigationViewContentPresenter navigator) { return; } - NotifyContentAboutNavigatingFrom(navigator.Content); + ObserveValueTask(NotifyContentAboutNavigatingFrom(navigator.Content, cancellationToken)); } - protected virtual void OnNavigated(NavigationEventArgs eventArgs) + protected virtual void OnNavigated( + NavigationEventArgs eventArgs, + CancellationToken cancellationToken = default + ) { ApplyTransitionEffectToNavigatedPage(eventArgs.Content); @@ -200,14 +206,28 @@ private void ApplyTransitionEffectToNavigatedPage(object content) _ = TransitionAnimationProvider.ApplyTransition(content, Transition, TransitionDuration); } - private static void NotifyContentAboutNavigatingTo(object content) + private static ValueTask NotifyContentAboutNavigatingTo( + object content, + CancellationToken cancellationToken = default + ) { - NotifyContentAboutNavigating(content, navigationAware => navigationAware.OnNavigatedToAsync()); + return NotifyContentAboutNavigating( + content, + cancellationToken, + static (aware, ct) => aware.OnNavigatedToAsync(ct) + ); } - private static void NotifyContentAboutNavigatingFrom(object content) + private static ValueTask NotifyContentAboutNavigatingFrom( + object content, + CancellationToken cancellationToken = default + ) { - NotifyContentAboutNavigating(content, navigationAware => navigationAware.OnNavigatedFromAsync()); + return NotifyContentAboutNavigating( + content, + cancellationToken, + static (aware, ct) => aware.OnNavigatedFromAsync(ct) + ); } [System.Diagnostics.CodeAnalysis.SuppressMessage( @@ -215,35 +235,75 @@ private static void NotifyContentAboutNavigatingFrom(object content) "SuspiciousTypeConversion.Global", Justification = "The library user might make a class inherit from both FrameworkElement and INavigationAware at the same time." )] - private static void NotifyContentAboutNavigating(object content, Func function) + private static ValueTask NotifyContentAboutNavigating( + object content, + CancellationToken cancellationToken, + Func function + ) { - async void PerformNotify(INavigationAware navigationAware) - { - await function(navigationAware).ConfigureAwait(false); - } - switch (content) { - // The order in which the OnNavigatedToAsync/OnNavigatedFromAsync methods of View and ViewModel are called - // is not guaranteed - case INavigationAware navigationAwareNavigationContent: - PerformNotify(navigationAwareNavigationContent); + case INavigationAware navigationAware: if ( - navigationAwareNavigationContent - is FrameworkElement { DataContext: INavigationAware viewModel } - && !ReferenceEquals(viewModel, navigationAwareNavigationContent) + navigationAware is FrameworkElement { DataContext: INavigationAware viewModel } + && !ReferenceEquals(viewModel, navigationAware) ) { - PerformNotify(viewModel); + ValueTask first = function(navigationAware, cancellationToken); + + return first.IsCompletedSuccessfully + ? function(viewModel, cancellationToken) + : AwaitBoth(first, function, viewModel, cancellationToken); } - break; - case INavigableView { ViewModel: INavigationAware navigationAwareNavigableViewViewModel }: - PerformNotify(navigationAwareNavigableViewViewModel); - break; - case FrameworkElement { DataContext: INavigationAware navigationAwareCurrentContent }: - PerformNotify(navigationAwareCurrentContent); - break; + return function(navigationAware, cancellationToken); + + case INavigableView { ViewModel: INavigationAware vm }: + return function(vm, cancellationToken); + + case FrameworkElement { DataContext: INavigationAware vm }: + return function(vm, cancellationToken); + } + + return default; + } + + private static async ValueTask AwaitBoth( + ValueTask first, + Func function, + INavigationAware second, + CancellationToken cancellationToken + ) + { + // SynchronizationContext is preserved intentionally — callers may update UI state. + await first; + await function(second, cancellationToken); + } + + /// + /// Properly consumes a in a fire-and-forget context. + /// If the task completed synchronously, no allocation occurs. + /// + private static void ObserveValueTask(ValueTask task) + { + if (task.IsCompletedSuccessfully) + { + return; + } + + AwaitObserved(task); + + static async void AwaitObserved(ValueTask pending) + { + try + { + await pending.ConfigureAwait(false); + } + catch (Exception) + { + // Navigation notification is best-effort from the presenter's perspective. + // The INavigationAware implementation is responsible for its own error handling. + } } } } diff --git a/src/Wpf.Ui/Controls/Snackbar/Snackbar.cs b/src/Wpf.Ui/Controls/Snackbar/Snackbar.cs index 9050723bd..960a153ea 100644 --- a/src/Wpf.Ui/Controls/Snackbar/Snackbar.cs +++ b/src/Wpf.Ui/Controls/Snackbar/Snackbar.cs @@ -265,6 +265,7 @@ public virtual void Show(bool immediately) { if (immediately) { + // NOTE: Fire & forget _ = Presenter.ImmediatelyDisplay(this); } else @@ -284,16 +285,16 @@ public virtual Task ShowAsync() /// /// Shows the . /// - public virtual async Task ShowAsync(bool immediately) + public virtual Task ShowAsync(bool immediately) { if (immediately) { - await Presenter.ImmediatelyDisplay(this); - } - else - { - Presenter.AddToQue(this); + return Presenter.ImmediatelyDisplay(this); } + + Presenter.AddToQue(this); + + return Task.CompletedTask; } /// diff --git a/src/Wpf.Ui/Controls/Snackbar/SnackbarPresenter.cs b/src/Wpf.Ui/Controls/Snackbar/SnackbarPresenter.cs index 0e5db4be1..ca3f86e54 100644 --- a/src/Wpf.Ui/Controls/Snackbar/SnackbarPresenter.cs +++ b/src/Wpf.Ui/Controls/Snackbar/SnackbarPresenter.cs @@ -62,6 +62,7 @@ private void ImmediatelyHideCurrent() private void ImmediatelyHidSnackbar(Snackbar snackbar) { snackbar.SetCurrentValue(Snackbar.IsShownProperty, false); + Content = null; } @@ -85,29 +86,32 @@ public virtual async Task ImmediatelyDisplay(Snackbar snackbar) { await HideCurrent(); await ShowSnackbar(snackbar); - await ShowQueuedSnackbarsAsync(); } - public virtual async Task HideCurrent() + public virtual Task HideCurrent(CancellationToken token = default) { if (Content is null) { - return; + return Task.CompletedTask; } CancellationTokenSource.Cancel(); - await HidSnackbar(Content); - ResetCancellationTokenSource(); + + return HideSnackbar(Content, delay: TimeSpan.Zero, resetSource: true, cancellationToken: token); } - private async Task ShowQueuedSnackbarsAsync() + private async Task ShowQueuedSnackbarsAsync(CancellationToken cancellationToken = default) { - while (Queue.Count > 0 && !CancellationTokenSource.IsCancellationRequested) + while ( + Queue.Count > 0 + && !CancellationTokenSource.IsCancellationRequested + && !cancellationToken.IsCancellationRequested + ) { Snackbar snackbar = Queue.Dequeue(); - await ShowSnackbar(snackbar); + await ShowSnackbar(snackbar, cancellationToken); } } @@ -116,22 +120,27 @@ private async Task ShowQueuedSnackbarsAsync() "WPF0041:Set mutable dependency properties using SetCurrentValue", Justification = "SetCurrentValue(ContentProperty, ...) will not work" )] - private async Task ShowSnackbar(Snackbar snackbar) + private Task ShowSnackbar(Snackbar snackbar, CancellationToken cancellationToken = default) { + if (cancellationToken.IsCancellationRequested) + { + return Task.CompletedTask; + } + Content = snackbar; snackbar.SetCurrentValue(Snackbar.IsShownProperty, true); - try - { - await Task.Delay(snackbar.Timeout, CancellationTokenSource.Token); - } - catch - { - return; - } - - await HidSnackbar(snackbar); + // TODO: Disposing unawaited task + // using var source = CancellationTokenSource.CreateLinkedTokenSource( + // cancellationToken, + // CancellationTokenSource.Token + // ); + return HideSnackbar( + snackbarToHide: snackbar, + delay: snackbar.Timeout, + cancellationToken: CancellationTokenSource.Token + ); } [System.Diagnostics.CodeAnalysis.SuppressMessage( @@ -139,17 +148,51 @@ private async Task ShowSnackbar(Snackbar snackbar) "WPF0041:Set mutable dependency properties using SetCurrentValue", Justification = "SetCurrentValue(ContentProperty, ...) will not work" )] - private async Task HidSnackbar(Snackbar snackbar) + private async Task HideSnackbar( + Snackbar snackbarToHide, + TimeSpan delay = default, + bool resetSource = false, + CancellationToken cancellationToken = default + ) { - snackbar.SetCurrentValue(Snackbar.IsShownProperty, false); + if (cancellationToken.IsCancellationRequested) + { + return; + } + + if (delay != TimeSpan.Zero) + { + try + { + await Task.Delay(delay, cancellationToken); + } + catch + { + return; + } + } - await Task.Delay(300); + snackbarToHide.SetCurrentValue(Snackbar.IsShownProperty, false); + + // NOTE: Post hide token, can we handle it better? + await Task.Delay(300, cancellationToken); + + if (Content is IDisposable disposableContent) + { + disposableContent.Dispose(); + } Content = null; + + if (resetSource) + { + ResetCancellationTokenSource(); + } } ~SnackbarPresenter() { + // TODO: Fe, fix if (!CancellationTokenSource.IsCancellationRequested) { CancellationTokenSource.Cancel(); diff --git a/src/Wpf.Ui/Extensions/ContentDialogServiceExtensions.cs b/src/Wpf.Ui/Extensions/ContentDialogServiceExtensions.cs index dc7577347..5c68cf5e2 100644 --- a/src/Wpf.Ui/Extensions/ContentDialogServiceExtensions.cs +++ b/src/Wpf.Ui/Extensions/ContentDialogServiceExtensions.cs @@ -44,7 +44,7 @@ public static Task ShowSimpleDialogAsync( CancellationToken cancellationToken = default ) { - var dialog = new ContentDialog() + var dialog = new ContentDialog { Title = options.Title, Content = options.Content, diff --git a/src/Wpf.Ui/Wpf.Ui.csproj b/src/Wpf.Ui/Wpf.Ui.csproj index 32b23765b..3b7b11ea1 100644 --- a/src/Wpf.Ui/Wpf.Ui.csproj +++ b/src/Wpf.Ui/Wpf.Ui.csproj @@ -21,7 +21,15 @@ - + + + + +