瀏覽代碼

feat: drop WinUI

Bruce Wayne 5 月之前
父節點
當前提交
eb79d467f2

+ 0 - 40
.github/workflows/CI.yaml

@@ -48,8 +48,6 @@ jobs:
         shell: pwsh
         run: |
           .\scripts\build.ps1
-          .\scripts\build.WinUI.ps1 x64
-          .\scripts\build.WinUI.ps1 arm64
 
       - name: Upload
         uses: actions/upload-artifact@v4
@@ -57,18 +55,6 @@ jobs:
           name: ${{ env.ProjectName }}
           path: src\${{ env.ProjectName }}\bin\${{ env.Configuration }}\${{ env.NET_TFM }}\generic\publish\
 
-      - name: Upload WinUI x64
-        uses: actions/upload-artifact@v4
-        with:
-          name: ${{ env.ProjectName }}.WinUI.x64
-          path: src\${{ env.ProjectName }}.WinUI\bin\x64\${{ env.Configuration }}\${{ env.NET_TFM }}\win-x64\publish\
-
-      - name: Upload WinUI arm64
-        uses: actions/upload-artifact@v4
-        with:
-          name: ${{ env.ProjectName }}.WinUI.arm64
-          path: src\${{ env.ProjectName }}.WinUI\bin\arm64\${{ env.Configuration }}\${{ env.NET_TFM }}\win-arm64\publish\
-
   nuget:
     needs: [test, check_format]
     if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
@@ -108,16 +94,6 @@ jobs:
           name: ${{ env.ProjectName }}
           path: ${{ env.ProjectName }}
 
-      - uses: actions/download-artifact@v4
-        with:
-          name: ${{ env.ProjectName }}.WinUI.x64
-          path: ${{ env.ProjectName }}.WinUI.x64
-
-      - uses: actions/download-artifact@v4
-        with:
-          name: ${{ env.ProjectName }}.WinUI.arm64
-          path: ${{ env.ProjectName }}.WinUI.arm64
-
       - name: Package
         shell: pwsh
         run: |
@@ -126,20 +102,6 @@ jobs:
           7z a -mx9 "$zip_path" ${{ env.ProjectName }}
           echo "GENERIC_SHA256=$((Get-FileHash $zip_path -Algorithm SHA256).Hash)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
 
-      - name: Package WinUI x64
-        shell: pwsh
-        run: |
-          $zip_path = "builtfiles/$env:ProjectName-${{ github.ref_name }}-x64.7z"
-          7z a -mx9 "$zip_path" ${{ env.ProjectName }}.WinUI.x64
-          echo "X64_SHA256=$((Get-FileHash $zip_path -Algorithm SHA256).Hash)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
-
-      - name: Package WinUI arm64
-        shell: pwsh
-        run: |
-          $zip_path = "builtfiles/$env:ProjectName-${{ github.ref_name }}-arm64.7z"
-          7z a -mx9 "$zip_path" ${{ env.ProjectName }}.WinUI.arm64
-          echo "ARM64_SHA256=$((Get-FileHash $zip_path -Algorithm SHA256).Hash)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
-
       - name: Create a new GitHub release
         uses: ncipollo/release-action@v1
         with:
@@ -152,5 +114,3 @@ jobs:
             | Filename | SHA-256 |
             | :- | :- |
             | <sub>${{ env.ProjectName }}-${{ github.ref_name }}.7z</sub> | <sub>${{ env.GENERIC_SHA256 }}</sub> |
-            | <sub>${{ env.ProjectName }}-${{ github.ref_name }}-x64.7z</sub> | <sub>${{ env.X64_SHA256 }}</sub> |
-            | <sub>${{ env.ProjectName }}-${{ github.ref_name }}-arm64.7z</sub> | <sub>${{ env.ARM64_SHA256 }}</sub> |

+ 0 - 4
NatTypeTester.slnx

@@ -26,10 +26,6 @@
       <Configuration Solution="Release|ARM64" Project="Release|Any CPU" />
       <Configuration Solution="Release|x64" Project="Release|Any CPU" />
     </Project>
-    <Project Path="src\NatTypeTester.WinUI\NatTypeTester.WinUI.csproj">
-      <Configuration Solution="Debug|Any CPU" Project="Debug|x64" />
-      <Configuration Solution="Release|Any CPU" Project="Release|x64" />
-    </Project>
     <Project Path="src\NatTypeTester\NatTypeTester.csproj" Type="Classic C#">
       <Configuration Solution="Debug|ARM64" Project="Debug|Any CPU" />
       <Configuration Solution="Debug|x64" Project="Debug|Any CPU" />

+ 0 - 19
scripts/build.WinUI.ps1

@@ -1,19 +0,0 @@
-param([string]$platform = 'x64')
-$ErrorActionPreference = 'Stop'
-
-dotnet --info
-
-$proj = 'NatTypeTester.WinUI'
-$net_tfm = 'net8.0-windows10.0.22621.0'
-$configuration = 'Release'
-$proj_path = "src\$proj\$proj.csproj"
-
-$rid = "win-$platform"
-Write-Host "Building $rid"
-
-$publishDir = "src\$proj\bin\$platform\$configuration\$net_tfm\$rid\publish"
-
-Remove-Item $publishDir -Recurse -Force -Confirm:$false -ErrorAction Ignore
-
-dotnet publish -c $configuration -f $net_tfm -p:Platform=$platform -r $rid --self-contained $proj_path
-if ($LASTEXITCODE) { exit $LASTEXITCODE }

+ 0 - 14
src/NatTypeTester.WinUI/App.xaml

@@ -1,14 +0,0 @@
-<Application
-    x:Class="NatTypeTester.App"
-    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
-    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
-    <Application.Resources>
-        <ResourceDictionary>
-            <ResourceDictionary.MergedDictionaries>
-                <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
-                <!-- Other merged dictionaries here -->
-            </ResourceDictionary.MergedDictionaries>
-            <!-- Other app resources here -->
-        </ResourceDictionary>
-    </Application.Resources>
-</Application>

+ 0 - 19
src/NatTypeTester.WinUI/App.xaml.cs

@@ -1,19 +0,0 @@
-namespace NatTypeTester;
-
-public partial class App
-{
-	private readonly IAbpApplicationWithInternalServiceProvider _application;
-
-	public App()
-	{
-		InitializeComponent();
-		_application = AbpApplicationFactory.Create<NatTypeTesterModule>(options => options.UseAutofac());
-		_application.Initialize();
-		_application.ServiceProvider.UseMicrosoftDependencyResolver();
-	}
-
-	protected override void OnLaunched(LaunchActivatedEventArgs args)
-	{
-		_application.ServiceProvider.GetRequiredService<MainWindow>().Activate();
-	}
-}

二進制
src/NatTypeTester.WinUI/Assets/icon.ico


+ 0 - 30
src/NatTypeTester.WinUI/Extensions/ContentDialogExtensions.cs

@@ -1,30 +0,0 @@
-namespace NatTypeTester.Extensions;
-
-internal static class ContentDialogExtensions
-{
-	public static async ValueTask HandleExceptionWithContentDialogAsync(this Exception ex, XamlRoot root)
-	{
-		ResourceLoader resourceLoader = ResourceLoader.GetForViewIndependentUse();
-		ContentDialog dialog = new();
-		try
-		{
-			dialog.XamlRoot = root;
-			dialog.Title = nameof(NatTypeTester);
-
-			string content = resourceLoader.GetString(ex.Message);
-			if (string.IsNullOrEmpty(content))
-			{
-				content = ex.Message;
-			}
-			dialog.Content = content;
-
-			dialog.PrimaryButtonText = resourceLoader.GetString(@"OK");
-
-			await dialog.ShowAsync();
-		}
-		finally
-		{
-			dialog.Hide();
-		}
-	}
-}

+ 0 - 15
src/NatTypeTester.WinUI/Extensions/DIExtension.cs

@@ -1,15 +0,0 @@
-namespace NatTypeTester.Extensions;
-
-internal static class DIExtension
-{
-	public static T GetRequiredService<T>(this IReadonlyDependencyResolver resolver, string? contract = null) where T : notnull
-	{
-		Requires.NotNull(resolver);
-
-		T? service = resolver.GetService<T>(contract);
-
-		Verify.Operation(service is not null, $@"No service for type {typeof(T)} has been registered.");
-
-		return service;
-	}
-}

+ 0 - 10
src/NatTypeTester.WinUI/MainWindow.xaml

@@ -1,10 +0,0 @@
-<Window
-    x:Class="NatTypeTester.MainWindow"
-    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
-    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
-    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
-    mc:Ignorable="d"
-    >
-    <Frame x:Name="MainFrame" />
-</Window>

+ 0 - 25
src/NatTypeTester.WinUI/MainWindow.xaml.cs

@@ -1,25 +0,0 @@
-namespace NatTypeTester;
-
-public sealed partial class MainWindow : ISingletonDependency
-{
-	public MainWindow()
-	{
-		InitializeComponent();
-
-		Title = nameof(NatTypeTester);
-		ExtendsContentIntoTitleBar = true;
-
-		AppWindow.Resize(new SizeInt32(500, 560));
-		AppWindow.SetIcon(@"Assets\icon.ico");
-
-		// CenterScreen
-		{
-			DisplayArea displayArea = DisplayArea.GetFromWindowId(AppWindow.Id, DisplayAreaFallback.Nearest);
-			int x = (displayArea.WorkArea.Width - AppWindow.Size.Width) / 2;
-			int y = (displayArea.WorkArea.Height - AppWindow.Size.Height) / 2;
-			AppWindow.Move(new PointInt32(x, y));
-		}
-
-		MainFrame.Navigate(typeof(MainPage));
-	}
-}

+ 0 - 42
src/NatTypeTester.WinUI/NatTypeTester.WinUI.csproj

@@ -1,42 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <OutputType>WinExe</OutputType>
-    <TargetFramework>net8.0-windows10.0.22621.0</TargetFramework>
-    <TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
-    <RootNamespace>NatTypeTester</RootNamespace>
-    <AssemblyName>NatTypeTester</AssemblyName>
-    <ApplicationManifest>app.manifest</ApplicationManifest>
-    <Platforms>x64;ARM64</Platforms>
-    <RuntimeIdentifiers>win-x64;win-arm64</RuntimeIdentifiers>
-    <UseWinUI>true</UseWinUI>
-    <ApplicationIcon>Assets\icon.ico</ApplicationIcon>
-    <Version>8.0.3</Version>
-    <EnableMsixTooling>true</EnableMsixTooling>
-    <WindowsPackageType>None</WindowsPackageType>
-    <WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
-    <EnableWindowsTargeting>true</EnableWindowsTargeting>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Hosting" />
-    <PackageReference Include="Microsoft.WindowsAppSDK" />
-    <PackageReference Include="Microsoft.Windows.SDK.BuildTools" />
-    <PackageReference Include="ReactiveMarbles.ObservableEvents.SourceGenerator" PrivateAssets="all" />
-    <PackageReference Include="ReactiveUI.WinUI" />
-    <PackageReference Include="Splat.Microsoft.Extensions.DependencyInjection" />
-    <PackageReference Include="Volo.Abp.Autofac" />
-    <Manifest Include="$(ApplicationManifest)" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <ProjectReference Include="..\NatTypeTester.ViewModels\NatTypeTester.ViewModels.csproj" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <Content Update="Assets\**\*">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-  </ItemGroup>
-
-</Project>

+ 0 - 47
src/NatTypeTester.WinUI/NatTypeTesterModule.cs

@@ -1,47 +0,0 @@
-global using JetBrains.Annotations;
-global using Microsoft;
-global using Microsoft.Extensions.DependencyInjection;
-global using Microsoft.Extensions.DependencyInjection.Extensions;
-global using Microsoft.UI.Windowing;
-global using Microsoft.UI.Xaml;
-global using Microsoft.UI.Xaml.Controls;
-global using Microsoft.VisualStudio.Threading;
-global using NatTypeTester.Extensions;
-global using NatTypeTester.ViewModels;
-global using NatTypeTester.Views;
-global using ReactiveMarbles.ObservableEvents;
-global using ReactiveUI;
-global using Splat;
-global using Splat.Microsoft.Extensions.DependencyInjection;
-global using STUN.Enums;
-global using System.Reactive.Disposables;
-global using System.Reactive.Linq;
-global using Volo.Abp;
-global using Volo.Abp.Autofac;
-global using Volo.Abp.DependencyInjection;
-global using Volo.Abp.Modularity;
-global using Windows.ApplicationModel.Resources;
-global using Windows.Graphics;
-global using Windows.System;
-
-namespace NatTypeTester;
-
-[DependsOn(
-	typeof(AbpAutofacModule),
-	typeof(NatTypeTesterViewModelModule)
-)]
-[UsedImplicitly]
-internal class NatTypeTesterModule : AbpModule
-{
-	public override void PreConfigureServices(ServiceConfigurationContext context)
-	{
-		context.Services.UseMicrosoftDependencyResolver();
-		Locator.CurrentMutable.InitializeSplat();
-		Locator.CurrentMutable.InitializeReactiveUI(RegistrationNamespace.WinUI);
-	}
-
-	public override void ConfigureServices(ServiceConfigurationContext context)
-	{
-		context.Services.TryAddTransient<RoutingState>();
-	}
-}

+ 0 - 177
src/NatTypeTester.WinUI/Strings/en-US/Resources.resw

@@ -1,177 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="BindingTestTextBox.Header" xml:space="preserve">
-    <value>Binding test</value>
-  </data>
-  <data name="FilteringBehaviorTextBox.Header" xml:space="preserve">
-    <value>Filtering behavior</value>
-  </data>
-  <data name="LocalEndComboBox.Header" xml:space="preserve">
-    <value>Local end</value>
-  </data>
-  <data name="LocalEndComboBox.PlaceholderText" xml:space="preserve">
-    <value>Any</value>
-  </data>
-  <data name="MappingBehaviorTextBox.Header" xml:space="preserve">
-    <value>Mapping behavior</value>
-  </data>
-  <data name="NoProxy.Content" xml:space="preserve">
-    <value>Don't use Proxy</value>
-  </data>
-  <data name="OK" xml:space="preserve">
-    <value>OK</value>
-  </data>
-  <data name="ProxyPasswordTextBox.Header" xml:space="preserve">
-    <value>Password</value>
-  </data>
-  <data name="ProxyRadioButtons.Header" xml:space="preserve">
-    <value>Proxy</value>
-  </data>
-  <data name="ProxyServerTextBox.Header" xml:space="preserve">
-    <value>Server</value>
-  </data>
-  <data name="ProxyUsernameTextBox.Header" xml:space="preserve">
-    <value>Username</value>
-  </data>
-  <data name="PublicEndTextBox.Header" xml:space="preserve">
-    <value>Public end</value>
-  </data>
-  <data name="RFC3489NatTypeTextBox.Header" xml:space="preserve">
-    <value>NAT type</value>
-  </data>
-  <data name="RFC3489Warning.Message" xml:space="preserve">
-    <value>This protocol is obsoleted and may not be suitable for modern routers or NAT.</value>
-  </data>
-  <data name="ServersComboBox.Header" xml:space="preserve">
-    <value>STUN Server</value>
-  </data>
-  <data name="SOCKS5Proxy.Content" xml:space="preserve">
-    <value>SOCKS5</value>
-  </data>
-  <data name="TestButton.Content" xml:space="preserve">
-    <value>Test</value>
-  </data>
-  <data name="Unknown proxy address" xml:space="preserve">
-    <value>Unknown proxy address</value>
-  </data>
-  <data name="Wrong STUN Server!" xml:space="preserve">
-    <value>Wrong STUN Server!</value>
-  </data>
-</root>

+ 0 - 177
src/NatTypeTester.WinUI/Strings/zh-CN/Resources.resw

@@ -1,177 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="BindingTestTextBox.Header" xml:space="preserve">
-    <value>绑定测试</value>
-  </data>
-  <data name="FilteringBehaviorTextBox.Header" xml:space="preserve">
-    <value>过滤行为</value>
-  </data>
-  <data name="LocalEndComboBox.Header" xml:space="preserve">
-    <value>本地地址</value>
-  </data>
-  <data name="LocalEndComboBox.PlaceholderText" xml:space="preserve">
-    <value>任意地址</value>
-  </data>
-  <data name="MappingBehaviorTextBox.Header" xml:space="preserve">
-    <value>映射行为</value>
-  </data>
-  <data name="NoProxy.Content" xml:space="preserve">
-    <value>不使用代理</value>
-  </data>
-  <data name="OK" xml:space="preserve">
-    <value>确定</value>
-  </data>
-  <data name="ProxyPasswordTextBox.Header" xml:space="preserve">
-    <value>密码</value>
-  </data>
-  <data name="ProxyRadioButtons.Header" xml:space="preserve">
-    <value>代理设置</value>
-  </data>
-  <data name="ProxyServerTextBox.Header" xml:space="preserve">
-    <value>服务器</value>
-  </data>
-  <data name="ProxyUsernameTextBox.Header" xml:space="preserve">
-    <value>用户名</value>
-  </data>
-  <data name="PublicEndTextBox.Header" xml:space="preserve">
-    <value>公网地址</value>
-  </data>
-  <data name="RFC3489NatTypeTextBox.Header" xml:space="preserve">
-    <value>NAT 类型</value>
-  </data>
-  <data name="RFC3489Warning.Message" xml:space="preserve">
-    <value>该协议已过时,可能不适用于现代路由器或 NAT。</value>
-  </data>
-  <data name="ServersComboBox.Header" xml:space="preserve">
-    <value>STUN 服务器</value>
-  </data>
-  <data name="SOCKS5Proxy.Content" xml:space="preserve">
-    <value>SOCKS5 代理</value>
-  </data>
-  <data name="TestButton.Content" xml:space="preserve">
-    <value>测试</value>
-  </data>
-  <data name="Unknown proxy address" xml:space="preserve">
-    <value>代理服务器地址输入有误!</value>
-  </data>
-  <data name="Wrong STUN Server!" xml:space="preserve">
-    <value>STUN 服务器输入有误!</value>
-  </data>
-</root>

+ 0 - 77
src/NatTypeTester.WinUI/Views/MainPage.xaml

@@ -1,77 +0,0 @@
-<views:MainReactivePage
-    x:Class="NatTypeTester.Views.MainPage"
-    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
-    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
-    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
-    xmlns:views="using:NatTypeTester.Views"
-    xmlns:reactiveUi="using:ReactiveUI"
-    mc:Ignorable="d"
-    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
-
-    <Grid RowDefinitions="28,Auto,*">
-
-        <!-- TitleBar -->
-        <StackPanel
-            Padding="8,0,0,0"
-            Orientation="Horizontal"
-            Spacing="5">
-            <Image Height="16" Source="/Assets/icon.ico" />
-            <TextBlock
-                Style="{StaticResource CaptionTextBlockStyle}"
-                VerticalAlignment="Center"
-                Text="NatTypeTester" />
-        </StackPanel>
-
-        <StackPanel Grid.Row="1"
-                    TabIndex="0"
-                    IsTabStop="True">
-            <ComboBox x:Name="ServersComboBox"
-                      x:Uid="ServersComboBox"
-                      Margin="10,10"
-                      IsEditable="True"
-                      HorizontalAlignment="Stretch">
-                <ComboBox.ItemTemplate>
-                    <DataTemplate>
-                        <TextBlock Text="{Binding }"/>
-                    </DataTemplate>
-                </ComboBox.ItemTemplate>
-            </ComboBox>
-        </StackPanel>
-
-        <NavigationView
-            Grid.Row="2"
-            x:Name="NavigationView"
-            IsBackEnabled="False"
-            IsBackButtonVisible="Collapsed"
-            PaneDisplayMode="LeftCompact"
-            IsPaneOpen="False">
-
-            <NavigationView.MenuItems>
-                <NavigationViewItem Content="RFC 5780" Tag="1">
-                    <NavigationViewItem.Icon>
-                        <FontIcon Glyph="&#xEDA3;" />
-                    </NavigationViewItem.Icon>
-                </NavigationViewItem>
-                <NavigationViewItem Content="RFC 3489" Tag="2">
-                    <NavigationViewItem.Icon>
-                        <FontIcon Glyph="&#xE969;" />
-                    </NavigationViewItem.Icon>
-                </NavigationViewItem>
-            </NavigationView.MenuItems>
-
-            <reactiveUi:RoutedViewHost
-                x:Name="RoutedViewHost"
-                HorizontalContentAlignment="Stretch"
-                VerticalContentAlignment="Stretch">
-                <reactiveUi:RoutedViewHost.ContentTransitions>
-                    <TransitionCollection>
-                        <ContentThemeTransition />
-                    </TransitionCollection>
-                </reactiveUi:RoutedViewHost.ContentTransitions>
-            </reactiveUi:RoutedViewHost>
-
-        </NavigationView>
-
-    </Grid>
-</views:MainReactivePage>

+ 0 - 70
src/NatTypeTester.WinUI/Views/MainPage.xaml.cs

@@ -1,70 +0,0 @@
-namespace NatTypeTester.Views;
-
-internal sealed partial class MainPage
-{
-	public MainPage()
-	{
-		InitializeComponent();
-		ViewModel = Locator.Current.GetRequiredService<MainWindowViewModel>();
-
-		IAbpLazyServiceProvider serviceProvider = Locator.Current.GetRequiredService<IAbpLazyServiceProvider>();
-
-		this.WhenActivated(d =>
-		{
-			#region DPI
-
-			double scale = XamlRoot.RasterizationScale;
-			if (scale is not 1.0)
-			{
-				AppWindow appWindow = Locator.Current.GetRequiredService<MainWindow>().AppWindow;
-				appWindow.Resize(new SizeInt32((int)(appWindow.Size.Width * scale), (int)(appWindow.Size.Height * scale)));
-			}
-
-			#endregion
-
-			this.Bind(ViewModel,
-				vm => vm.Config.StunServer,
-				v => v.ServersComboBox.Text
-			).DisposeWith(d);
-
-			this.OneWayBind(ViewModel,
-				vm => vm.StunServers,
-				v => v.ServersComboBox.ItemsSource
-			).DisposeWith(d);
-
-			this.OneWayBind(ViewModel, vm => vm.Router, v => v.RoutedViewHost.Router).DisposeWith(d);
-
-			NavigationView.Events().SelectionChanged.Subscribe(parameter =>
-			{
-				if (parameter.args.IsSettingsSelected)
-				{
-					ViewModel.Router.Navigate.Execute(serviceProvider.LazyGetRequiredService<SettingViewModel>()).Subscribe().Dispose();
-					return;
-				}
-
-				if (parameter.args.SelectedItem is not NavigationViewItem { Tag: string tag })
-				{
-					return;
-				}
-
-				switch (tag)
-				{
-					case @"1":
-					{
-						ViewModel.Router.Navigate.Execute(serviceProvider.LazyGetRequiredService<RFC5780ViewModel>()).Subscribe().Dispose();
-						break;
-					}
-					case @"2":
-					{
-						ViewModel.Router.Navigate.Execute(serviceProvider.LazyGetRequiredService<RFC3489ViewModel>()).Subscribe().Dispose();
-						break;
-					}
-				}
-			}).DisposeWith(d);
-			NavigationView.SelectedItem = NavigationView.MenuItems.OfType<NavigationViewItem>().First();
-
-			ViewModel.LoadStunServer();
-			ServersComboBox.SelectedIndex = 0;
-		});
-	}
-}

+ 0 - 34
src/NatTypeTester.WinUI/Views/RFC3489Page.xaml

@@ -1,34 +0,0 @@
-<views:RFC3489ReactivePage
-    x:Class="NatTypeTester.Views.RFC3489Page"
-    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
-    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-    xmlns:views="using:NatTypeTester.Views"
-    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
-    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
-    mc:Ignorable="d">
-
-    <Grid Margin="10" RowDefinitions="Auto,*">
-
-        <StackPanel Spacing="5">
-            <InfoBar
-                IsOpen="True"
-                IsClosable="False"
-                Severity="Warning"
-                x:Uid="RFC3489Warning" />
-
-            <TextBox x:Name="NatTypeTextBox"
-                     x:Uid="RFC3489NatTypeTextBox"
-                     IsReadOnly="True" />
-            <TextBox x:Name="LocalEndComboBox"
-                     x:Uid="LocalEndComboBox" />
-            <TextBox x:Name="PublicEndTextBox"
-                     x:Uid="PublicEndTextBox"
-                     IsReadOnly="True" />
-        </StackPanel>
-
-        <Button x:Name="TestButton"
-                x:Uid="TestButton"
-                Grid.Row="1"
-                HorizontalAlignment="Right" VerticalAlignment="Bottom" />
-    </Grid>
-</views:RFC3489ReactivePage>

+ 0 - 32
src/NatTypeTester.WinUI/Views/RFC3489Page.xaml.cs

@@ -1,32 +0,0 @@
-namespace NatTypeTester.Views;
-
-[ExposeServices(typeof(IViewFor<RFC3489ViewModel>))]
-[UsedImplicitly]
-internal sealed partial class RFC3489Page : ITransientDependency
-{
-	public RFC3489Page(RFC3489ViewModel viewModel)
-	{
-		InitializeComponent();
-		ViewModel = viewModel;
-
-		this.WhenActivated(d =>
-		{
-			this.OneWayBind(ViewModel, vm => vm.Result3489.NatType, v => v.NatTypeTextBox.Text).DisposeWith(d);
-
-			this.Bind(ViewModel, vm => vm.Result3489.LocalEndPoint, v => v.LocalEndComboBox.Text).DisposeWith(d);
-
-			LocalEndComboBox.Events().LostFocus.Subscribe(_ => LocalEndComboBox.Text = ViewModel.Result3489.LocalEndPoint?.ToString()).DisposeWith(d);
-
-			this.OneWayBind(ViewModel, vm => vm.Result3489.PublicEndPoint, v => v.PublicEndTextBox.Text).DisposeWith(d);
-
-			this.BindCommand(ViewModel, vm => vm.TestClassicNatType, v => v.TestButton).DisposeWith(d);
-
-			this.Events().KeyDown
-				.Where(x => x.Key is VirtualKey.Enter && TestButton.Command.CanExecute(default))
-				.Subscribe(_ => TestButton.Command.Execute(default))
-				.DisposeWith(d);
-
-			ViewModel.TestClassicNatType.ThrownExceptions.Subscribe(ex => ex.HandleExceptionWithContentDialogAsync(Content.XamlRoot).Forget()).DisposeWith(d);
-		});
-	}
-}

+ 0 - 46
src/NatTypeTester.WinUI/Views/RFC5780Page.xaml

@@ -1,46 +0,0 @@
-<views:RFC5780ReactivePage
-    x:Class="NatTypeTester.Views.RFC5780Page"
-    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
-    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-    xmlns:views="using:NatTypeTester.Views"
-    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
-    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
-    mc:Ignorable="d">
-
-    <Grid Margin="10" RowDefinitions="Auto,*">
-
-        <StackPanel Spacing="5">
-            <Grid>
-                <RadioButtons x:Name="TransportTypeRadioButtons" MaxColumns="4" Margin="0,0,0,5">
-                    <RadioButton Content="UDP" />
-                    <RadioButton Content="TCP" />
-                    <RadioButton Content="TLS" />
-                </RadioButtons>
-            </Grid>
-            <TextBox
-                x:Name="BindingTestTextBox"
-                x:Uid="BindingTestTextBox"
-                IsReadOnly="True" />
-            <TextBox
-                x:Name="MappingBehaviorTextBox"
-                x:Uid="MappingBehaviorTextBox"
-                IsReadOnly="True" />
-            <TextBox
-                x:Name="FilteringBehaviorTextBox"
-                x:Uid="FilteringBehaviorTextBox"
-                IsReadOnly="True" />
-            <TextBox x:Name="LocalAddressComboBox"
-                     x:Uid="LocalEndComboBox" />
-            <TextBox
-                x:Name="MappingAddressTextBox"
-                IsReadOnly="True"
-                x:Uid="PublicEndTextBox" />
-        </StackPanel>
-
-        <Button x:Name="DiscoveryButton"
-                x:Uid="TestButton"
-                Grid.Row="1"
-                HorizontalAlignment="Right" VerticalAlignment="Bottom" />
-    </Grid>
-
-</views:RFC5780ReactivePage>

+ 0 - 42
src/NatTypeTester.WinUI/Views/RFC5780Page.xaml.cs

@@ -1,42 +0,0 @@
-namespace NatTypeTester.Views;
-
-[ExposeServices(typeof(IViewFor<RFC5780ViewModel>))]
-[UsedImplicitly]
-internal sealed partial class RFC5780Page : ITransientDependency
-{
-	public RFC5780Page(RFC5780ViewModel viewModel)
-	{
-		InitializeComponent();
-		ViewModel = viewModel;
-
-		this.WhenActivated(d =>
-		{
-			this.Bind(ViewModel, vm => vm.TransportType, v => v.TransportTypeRadioButtons.SelectedIndex, type => (int)type, index => (TransportType)index).DisposeWith(d);
-			ViewModel.WhenAnyValue(vm => vm.TransportType).Subscribe(_ => ViewModel.ResetResult()).DisposeWith(d);
-			this.OneWayBind(ViewModel, vm => vm.TransportType, v => v.FilteringBehaviorTextBox.Visibility, type => type is TransportType.Udp ? Visibility.Visible : Visibility.Collapsed).DisposeWith(d);
-
-			this.OneWayBind(ViewModel, vm => vm.Result5389.BindingTestResult, v => v.BindingTestTextBox.Text).DisposeWith(d);
-
-			this.OneWayBind(ViewModel, vm => vm.Result5389.MappingBehavior, v => v.MappingBehaviorTextBox.Text).DisposeWith(d);
-
-			this.OneWayBind(ViewModel, vm => vm.Result5389.FilteringBehavior, v => v.FilteringBehaviorTextBox.Text).DisposeWith(d);
-
-			this.Bind(ViewModel, vm => vm.Result5389.LocalEndPoint, v => v.LocalAddressComboBox.Text).DisposeWith(d);
-
-			LocalAddressComboBox.Events().LostFocus.Subscribe(_ => LocalAddressComboBox.Text = ViewModel.Result5389.LocalEndPoint?.ToString()).DisposeWith(d);
-
-			this.OneWayBind(ViewModel, vm => vm.Result5389.PublicEndPoint, v => v.MappingAddressTextBox.Text).DisposeWith(d);
-
-			this.BindCommand(ViewModel, vm => vm.DiscoveryNatType, v => v.DiscoveryButton).DisposeWith(d);
-
-			this.Events().KeyDown
-				.Where(x => x.Key is VirtualKey.Enter && DiscoveryButton.Command.CanExecute(default))
-				.Subscribe(_ => DiscoveryButton.Command.Execute(default))
-				.DisposeWith(d);
-
-			ViewModel.DiscoveryNatType.ThrownExceptions.Subscribe(ex => ex.HandleExceptionWithContentDialogAsync(Content.XamlRoot).Forget()).DisposeWith(d);
-
-			ViewModel.DiscoveryNatType.IsExecuting.Subscribe(b => TransportTypeRadioButtons.IsEnabled = !b).DisposeWith(d);
-		});
-	}
-}

+ 0 - 10
src/NatTypeTester.WinUI/Views/ReactivePages.cs

@@ -1,10 +0,0 @@
-// https://github.com/microsoft/microsoft-ui-xaml/issues/931
-namespace NatTypeTester.Views;
-
-internal abstract class MainReactivePage : ReactivePage<MainWindowViewModel>;
-
-internal abstract class SettingReactivePage : ReactivePage<SettingViewModel>;
-
-internal abstract class RFC5780ReactivePage : ReactivePage<RFC5780ViewModel>;
-
-internal abstract class RFC3489ReactivePage : ReactivePage<RFC3489ViewModel>;

+ 0 - 45
src/NatTypeTester.WinUI/Views/SettingPage.xaml

@@ -1,45 +0,0 @@
-<views:SettingReactivePage
-    x:Class="NatTypeTester.Views.SettingPage"
-    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
-    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-    xmlns:views="using:NatTypeTester.Views"
-    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
-    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
-    mc:Ignorable="d">
-
-    <Grid RowDefinitions="Auto,Auto">
-        <Grid Margin="15" Grid.Row="0">
-            <RadioButtons x:Name="ProxyRadioButtons" x:Uid="ProxyRadioButtons">
-                <RadioButton x:Uid="NoProxy" />
-                <RadioButton x:Uid="SOCKS5Proxy" />
-            </RadioButtons>
-        </Grid>
-
-        <ContentControl x:Name="ProxyConfigGrid" Grid.Row="1" Margin="15,0" HorizontalContentAlignment="Stretch">
-            <Grid>
-                <Grid.RowDefinitions>
-                    <RowDefinition Height="Auto" />
-                    <RowDefinition Height="Auto" />
-                    <RowDefinition Height="Auto" />
-                </Grid.RowDefinitions>
-                <TextBox
-                    x:Name="ProxyServerTextBox"
-                    x:Uid="ProxyServerTextBox"
-                    Grid.Row="0"
-                    Margin="0,5" IsReadOnly="False" />
-                <TextBox
-                    x:Name="ProxyUsernameTextBox"
-                    x:Uid="ProxyUsernameTextBox"
-                    Grid.Row="1"
-                    Margin="0,5" IsReadOnly="False" />
-                <TextBox
-                    x:Name="ProxyPasswordTextBox"
-                    x:Uid="ProxyPasswordTextBox"
-                    Grid.Row="2"
-                    Margin="0,5" />
-            </Grid>
-        </ContentControl>
-
-    </Grid>
-
-</views:SettingReactivePage>

+ 0 - 24
src/NatTypeTester.WinUI/Views/SettingPage.xaml.cs

@@ -1,24 +0,0 @@
-namespace NatTypeTester.Views;
-
-[ExposeServices(typeof(IViewFor<SettingViewModel>))]
-[UsedImplicitly]
-internal sealed partial class SettingPage : ITransientDependency
-{
-	public SettingPage()
-	{
-		InitializeComponent();
-
-		this.WhenActivated(d =>
-		{
-			this.Bind(ViewModel, vm => vm.Config.ProxyServer, v => v.ProxyServerTextBox.Text).DisposeWith(d);
-
-			this.Bind(ViewModel, vm => vm.Config.ProxyUser, v => v.ProxyUsernameTextBox.Text).DisposeWith(d);
-
-			this.Bind(ViewModel, vm => vm.Config.ProxyPassword, v => v.ProxyPasswordTextBox.Text).DisposeWith(d);
-
-			this.Bind(ViewModel, vm => vm.Config.ProxyType, v => v.ProxyRadioButtons.SelectedIndex, type => (int)type, index => (ProxyType)index).DisposeWith(d);
-
-			this.OneWayBind(ViewModel, vm => vm.Config.ProxyType, v => v.ProxyConfigGrid.IsEnabled, type => type is not ProxyType.Plain).DisposeWith(d);
-		});
-	}
-}

+ 0 - 20
src/NatTypeTester.WinUI/app.manifest

@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
-  <assemblyIdentity version="1.0.0.0" name="NatTypeTester.WinUI.app"/>
-
-  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
-    <application>
-      <!--The ID below informs the system that this application is compatible with OS features first introduced in Windows 8. 
-      For more info see https://docs.microsoft.com/windows/win32/sysinfo/targeting-your-application-at-windows-8-1 
-      
-      It is also necessary to support features in unpackaged applications, for example the custom titlebar implementation.-->
-      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
-    </application>
-  </compatibility>
-  
-  <application xmlns="urn:schemas-microsoft-com:asm.v3">
-    <windowsSettings>
-      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
-    </windowsSettings>
-  </application>
-</assembly>