Redesign main window to be winui3 themed

master
LeapwardKoex 2024-11-16 16:23:29 +13:00
parent 3eb9c1438a
commit 066ecf6850
8 changed files with 180 additions and 76 deletions

View File

@ -2,8 +2,14 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfMaiTouchEmulator" xmlns:local="clr-namespace:WpfMaiTouchEmulator"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
StartupUri="MainWindow.xaml"> StartupUri="MainWindow.xaml">
<Application.Resources> <Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ui:ThemesDictionary Theme="Light" />
<ui:ControlsDictionary />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources> </Application.Resources>
</Application> </Application>

View File

@ -3,61 +3,112 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
mc:Ignorable="d" mc:Ignorable="d"
Closing="MainWindow_Closing" Closing="MainWindow_Closing"
Title="MainWindow" Height="400" Width="587" ResizeMode="CanMinimize" WindowStartupLocation="CenterScreen"> Background="AliceBlue"
<StackPanel Margin="0,0,0,0"> Title="MainWindow" Height="750" Width="500" WindowStartupLocation="CenterScreen">
<Menu Width="Auto" Height="20"> <ScrollViewer>
<MenuItem Header="{Binding LbMenuCategoryHelp}" d:Header="_Help"> <StackPanel MaxWidth="400" Margin="0,0,0,50">
<MenuItem x:Name="instructionsLabel" Header="{Binding LbMenuItemSetup}" HorizontalAlignment="Left" Width="220" Click="instructionsLabel_Click"/> <Menu>
</MenuItem> <MenuItem Header="{Binding LbMenuCategoryHelp}" d:Header="_Help">
</Menu> <MenuItem.Icon>
<Grid Background="Transparent" > <ui:SymbolIcon Symbol="BookQuestionMark20" />
<Button x:Name="ConnectToPortButton" Content="{Binding LbConnectToPort}" d:Content="Connect to port" HorizontalAlignment="Left" Margin="10,95,0,0" VerticalAlignment="Top" Click="ConnectToPortButton_Click" Width="130" /> </MenuItem.Icon>
<TextBox x:Name="RecievedLogBox" <MenuItem x:Name="instructionsLabel" Header="{Binding LbMenuItemSetup}" Click="instructionsLabel_Click"/>
IsReadOnly="True" </MenuItem>
HorizontalScrollBarVisibility="Disabled" </Menu>
VerticalScrollBarVisibility="Auto" <ui:Card Margin="0,0,0,10">
AcceptsReturn="True" <StackPanel>
AcceptsTab="True" <ui:TextBlock d:Text="Connection State" Text="{Binding LbConnectionState}"/>
TextWrapping="Wrap" Margin="376,34,0,0" HorizontalAlignment="Left" Width="88" Height="80" VerticalAlignment="Top" /> <Label x:Name="connectionStateLabel" Content="{Binding LbConnectionStateNotConnected}" d:Content="Not connected" FontSize="10"/>
<TextBox x:Name="SentLogBox" <Separator Margin="0,6"/>
IsReadOnly="True" <Label x:Name="recievedDataLabel" Content="{Binding LbRecievedData}" d:Content="Recieved Data"/>
HorizontalScrollBarVisibility="Disabled" <ui:TextBox x:Name="RecievedLogBox"
VerticalScrollBarVisibility="Auto" IsReadOnly="True"
AcceptsReturn="True" HorizontalScrollBarVisibility="Disabled"
AcceptsTab="True" VerticalScrollBarVisibility="Auto"
TextWrapping="Wrap" Margin="480,34,0,0" HorizontalAlignment="Left" Width="88" Height="80" VerticalAlignment="Top" /> Focusable="False"
<Label x:Name="label" Content="{Binding LbRecievedData}" d:Content="Recieved Data" HorizontalAlignment="Left" Margin="376,8,0,0" VerticalAlignment="Top" Width="88"/> AcceptsReturn="True"
<Label x:Name="label_Copy" Content="{Binding LbSentData}" d:Content="Sent Data" HorizontalAlignment="Left" Margin="480,8,0,0" VerticalAlignment="Top" Width="88"/> AcceptsTab="True"
<Label x:Name="label_Copy1" Content="{Binding LbButtonState}" d:Content="Button state" HorizontalAlignment="Left" Margin="238,56,0,0" VerticalAlignment="Top" Width="88"/> TextWrapping="Wrap" Height="80">
<Label x:Name="buttonStateValue" Content="0" HorizontalAlignment="Left" Margin="238,82,0,0" VerticalAlignment="Top" RenderTransformOrigin="3.566,1.468" FontSize="10"/> <ui:TextBox.Icon>
<CheckBox x:Name="debugMode" Content="{Binding LbDebugMode}" d:Content="Debug mode" HorizontalAlignment="Left" Margin="10,213,0,0" VerticalAlignment="Top" IsChecked="{Binding Path=IsDebugEnabled}" Click="debugMode_Click" Cursor="" Focusable="False" ToolTip="Show the touchpad with translucency and show inputs highlighted" Width="224"/> <ui:SymbolIcon Symbol="ArrowDownLeft20" />
<CheckBox x:Name="automaticTouchPanelPositioning" d:Content="Automatic touch panel positioning" HorizontalAlignment="Left" Margin="10,233,0,0" VerticalAlignment="Top" Height="17" Width="224" Content="{Binding LbAutoSensorPositioning}" IsChecked="{Binding Path=IsAutomaticPositioningEnabled}" Click="automaticTouchPanelPositioning_Click" ToolTip="{Binding LbAutoSensorPositioningTT}"/> </ui:TextBox.Icon>
<CheckBox x:Name="automaticPortConnecting" d:Content="Automatic port connecting" HorizontalAlignment="Left" Margin="10,255,0,0" VerticalAlignment="Top" Height="17" Width="224" Content="{Binding LbAutoPortConnecting}" IsChecked="{Binding Path=IsAutomaticPortConnectingEnabled}" Click="automaticPortConnecting_Click" ToolTip="{Binding LbAutoPortConnectingTT}"/> </ui:TextBox>
<Label x:Name="label1" Content="{Binding LbConnectionState}" d:Content="Connection state" HorizontalAlignment="Left" Margin="238,8,0,0" VerticalAlignment="Top"/>
<Label x:Name="connectionStateLabel" Content="{Binding LbConnectionStateNotConnected}" d:Content="Not connected" HorizontalAlignment="Left" Margin="238,31,0,0" VerticalAlignment="Top" FontSize="10"/>
<CheckBox x:Name="exitWithSinmai" Content="{Binding LbExitWithSinmai}" d:Content="Exit with Sinmai" HorizontalAlignment="Left" Margin="10,277,0,0" VerticalAlignment="Top" Height="17" Width="224" IsChecked="{Binding IsExitWithSinmaiEnabled}" Click="exitWithSinmai_Click" ToolTip="{Binding LbExitWithSinmaiTT}"/>
<CheckBox x:Name="emulateRingButtons" Content="{Binding LbEmulateRingButtons}" d:Content="Emulate ring buttons" HorizontalAlignment="Left" Margin="10,299,0,0" VerticalAlignment="Top" Height="17" Width="224" IsChecked="{Binding IsRingButtonEmulationEnabled}" ToolTip="{Binding LbEmulateRingButtonsTT}" Click="emulateRingButtons_Click"/>
<Button x:Name="buttonInstallComPort" Content="{Binding LbInstallComPort}" d:Content="Install COM port" HorizontalAlignment="Left" Margin="10,9,0,0" VerticalAlignment="Top" Click="buttonInstallComPort_Click" Width="130"/>
<Button x:Name="buttonUninstallComPorts" Content="{Binding LbUninstallComPort}" d:Content="Uninstall COM port" HorizontalAlignment="Left" Margin="10,34,0,0" VerticalAlignment="Top" Click="buttonUninstallComPorts_Click" Width="130"/>
<Button x:Name="buttonListComPorts" Content="{Binding LbListComPorts}" d:Content="List installed COM ports" HorizontalAlignment="Left" Margin="10,59,0,0" VerticalAlignment="Top" Click="buttonListComPorts_Click" Width="130"/>
<Separator HorizontalAlignment="Left" Margin="10,84,0,0" VerticalAlignment="Top" Height="6" Width="126"/>
<ComboBox x:Name="languageSelector" HorizontalAlignment="Left" Margin="10,186,0,0" VerticalAlignment="Top" Width="149" ItemsSource="{Binding SupportedLanguages}"
DisplayMemberPath="NativeName"
SelectedItem="{Binding SelectedLanguage, Mode=TwoWay}"/>
<Label x:Name="languageLabel" Content="{Binding LbLanguageDropdown}" d:Content="Language" HorizontalAlignment="Left" Margin="10,155,0,0" VerticalAlignment="Top" Width="126"/>
<Label x:Name="borderSettingLabel" Content="{Binding LbBorderSettings}" d:Content="Border Settings" HorizontalAlignment="Left" Margin="238,155,0,0" VerticalAlignment="Top" Width="126"/>
<StackPanel Margin="238,185,0,0" HorizontalAlignment="Left" Width="200" Height="91" VerticalAlignment="Top">
<RadioButton x:Name="rbBorderDisabled" Content="{Binding LbBorderDisabled}" d:Content="Disabled" GroupName="ColorOptions" Checked="RadioButton1_Checked"/>
<RadioButton x:Name="rbBorderSolidColour" Content="{Binding LbBorderSolid}" d:Content="Solid Colour (#AARRGGBB)" GroupName="ColorOptions" Checked="RadioButton2_Checked"/>
<TextBox x:Name="txtBorderHexColor" Text="{Binding Path=BorderColour}" IsEnabled="False" Margin="10,10,0,10" Width="127" Height="25" TextChanged="txtBorderHexColor_TextChanged"/>
<RadioButton Name="rbBorderRainbow" Content="{Binding LbBorderRainbow}" d:Content="Rainbow" GroupName="ColorOptions" Checked="RadioButton3_Checked"/> <Label x:Name="sentDataLabel" Content="{Binding LbSentData}" d:Content="Sent Data"/>
</StackPanel> <ui:TextBox x:Name="SentLogBox"
IsReadOnly="True"
Focusable="False"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto"
AcceptsReturn="True"
AcceptsTab="True"
TextWrapping="Wrap" Height="80">
<ui:TextBox.Icon>
<ui:SymbolIcon Symbol="ArrowUpRight20" />
</ui:TextBox.Icon>
</ui:TextBox>
<Separator Margin="0,6"/>
<Label x:Name="buttonStateLabel" Content="{Binding LbButtonState}" d:Content="Button state" />
<Label x:Name="buttonStateValue" Content="0" />
</StackPanel>
</ui:Card>
<ui:CardExpander
CornerRadius="8"
Margin="0,0,0,10"
Header="{Binding LbComPort}"
d:Header="COM Port">
<ui:CardExpander.Icon>
<ui:SymbolIcon Symbol="PlugDisconnected20" />
</ui:CardExpander.Icon>
<StackPanel>
<ui:Button x:Name="ConnectToPortButton" Content="{Binding LbConnectToPort}" d:Content="Connect to port" Click="ConnectToPortButton_Click" />
<Separator Margin="0,6"/>
<ui:Button x:Name="buttonInstallComPort" Content="{Binding LbInstallComPort}" Margin="0,0,0,10" d:Content="Install COM port" Click="buttonInstallComPort_Click" />
<ui:Button x:Name="buttonUninstallComPorts" Content="{Binding LbUninstallComPort}" Margin="0,0,0,10" d:Content="Uninstall COM port" Click="buttonUninstallComPorts_Click" />
<ui:Button x:Name="buttonListComPorts" Content="{Binding LbListComPorts}" d:Content="List installed COM ports" Click="buttonListComPorts_Click" />
</StackPanel>
</ui:CardExpander>
<ui:CardExpander
CornerRadius="8"
Margin="0,0,0,10"
Header="{Binding LbBorderSettings}"
d:Header="Border settings">
<ui:CardExpander.Icon>
<ui:SymbolIcon Symbol="EditSettings20" />
</ui:CardExpander.Icon>
<StackPanel>
<RadioButton x:Name="rbBorderDisabled" Content="{Binding LbBorderDisabled}" d:Content="Disabled" GroupName="ColorOptions" Checked="RadioButton1_Checked"/>
<RadioButton x:Name="rbBorderSolidColour" Content="{Binding LbBorderSolid}" d:Content="Solid Colour" GroupName="ColorOptions" Checked="RadioButton2_Checked"/>
<ui:TextBox x:Name="txtBorderHexColor" Text="{Binding Path=BorderColour}" PlaceholderText="#AARRGGBB" IsEnabled="False" Margin="10,10,0,10" TextChanged="txtBorderHexColor_TextChanged"/>
</Grid> <RadioButton Name="rbBorderRainbow" Content="{Binding LbBorderRainbow}" d:Content="Rainbow" GroupName="ColorOptions" Checked="RadioButton3_Checked"/>
</StackPanel> </StackPanel>
</ui:CardExpander>
<ui:CardExpander
CornerRadius="8"
Header="{Binding LbSettings}"
d:Header="Settings">
<ui:CardExpander.Icon>
<ui:SymbolIcon Symbol="Settings20" />
</ui:CardExpander.Icon>
<StackPanel>
<Label x:Name="languageLabel" Content="{Binding LbLanguageDropdown}" d:Content="Language"/>
<ComboBox x:Name="languageSelector" ItemsSource="{Binding SupportedLanguages}" DisplayMemberPath="NativeName" SelectedItem="{Binding SelectedLanguage, Mode=TwoWay}"/>
<Separator Margin="0,6"/>
<CheckBox x:Name="debugMode" Content="{Binding LbDebugMode}" d:Content="Debug mode" IsChecked="{Binding Path=IsDebugEnabled}" Click="debugMode_Click" Cursor="" Focusable="False" ToolTip="Show the touchpad with translucency and show inputs highlighted" />
<CheckBox x:Name="automaticTouchPanelPositioning" d:Content="Automatic touch panel positioning" Content="{Binding LbAutoSensorPositioning}" IsChecked="{Binding Path=IsAutomaticPositioningEnabled}" Click="automaticTouchPanelPositioning_Click" ToolTip="{Binding LbAutoSensorPositioningTT}"/>
<CheckBox x:Name="automaticPortConnecting" d:Content="Automatic port connecting" Content="{Binding LbAutoPortConnecting}" IsChecked="{Binding Path=IsAutomaticPortConnectingEnabled}" Click="automaticPortConnecting_Click" ToolTip="{Binding LbAutoPortConnectingTT}"/>
<CheckBox x:Name="exitWithSinmai" Content="{Binding LbExitWithSinmai}" d:Content="Exit with Sinmai" IsChecked="{Binding IsExitWithSinmaiEnabled}" Click="exitWithSinmai_Click" ToolTip="{Binding LbExitWithSinmaiTT}"/>
<CheckBox x:Name="emulateRingButtons" Content="{Binding LbEmulateRingButtons}" d:Content="Emulate ring buttons" IsChecked="{Binding IsRingButtonEmulationEnabled}" ToolTip="{Binding LbEmulateRingButtonsTT}" Click="emulateRingButtons_Click"/>
</StackPanel>
</ui:CardExpander>
</StackPanel>
</ScrollViewer>
</Window> </Window>

View File

@ -8,84 +8,92 @@ namespace WpfMaiTouchEmulator;
public class MainWindowViewModel : INotifyPropertyChanged public class MainWindowViewModel : INotifyPropertyChanged
{ {
// Language // Language
public string LbAutoPortConnecting public string? LbAutoPortConnecting
{ {
get; set; get; set;
} }
public string LbAutoSensorPositioning public string? LbAutoSensorPositioning
{ {
get; set; get; set;
} }
public string LbButtonState public string? LbButtonState
{ {
get; set; get; set;
} }
public string LbConnectionState public string? LbConnectionState
{ {
get; set; get; set;
} }
public string LbConnectionStateNotConnected public string? LbConnectionStateNotConnected
{ {
get; set; get; set;
} }
public string LbConnectToPort public string? LbConnectToPort
{ {
get; set; get; set;
} }
public string LbDebugMode public string? LbDebugMode
{ {
get; set; get; set;
} }
public string LbExitWithSinmai public string? LbExitWithSinmai
{ {
get; set; get; set;
} }
public string LbEmulateRingButtons public string? LbEmulateRingButtons
{ {
get; set; get; set;
} }
public string LbInstallComPort public string? LbInstallComPort
{ {
get; set; get; set;
} }
public string LbLanguageDropdown public string? LbLanguageDropdown
{ {
get; set; get; set;
} }
public string LbBorderSettings public string? LbBorderSettings
{ {
get; set; get; set;
} }
public string LbBorderDisabled public string? LbSettings
{ {
get; set; get; set;
} }
public string LbBorderSolid public string? LbComPort
{ {
get; set; get; set;
} }
public string LbBorderRainbow public string? LbBorderDisabled
{ {
get; set; get; set;
} }
public string LbListComPorts public string? LbBorderSolid
{ {
get; set; get; set;
} }
public string LbReceivedData public string? LbBorderRainbow
{ {
get; set; get; set;
} }
public string LbRecievedData public string? LbListComPorts
{
get; set;
}
public string? LbReceivedData
{
get; set;
}
public string? LbRecievedData
{ {
get; get;
private set; private set;
} }
public string LbSentData public string? LbSentData
{ {
get; set; get; set;
} }
public string LbUninstallComPort public string? LbUninstallComPort
{ {
get; set; get; set;
} }
@ -334,7 +342,9 @@ public class MainWindowViewModel : INotifyPropertyChanged
LbInstallComPort = resourceManager.GetString("lbInstallComPort"); LbInstallComPort = resourceManager.GetString("lbInstallComPort");
LbLanguageDropdown = resourceManager.GetString("lbLanguageDropdown"); LbLanguageDropdown = resourceManager.GetString("lbLanguageDropdown");
LbComPort = resourceManager.GetString("LbComPort");
LbBorderSettings = resourceManager.GetString("LbBorderSettings"); LbBorderSettings = resourceManager.GetString("LbBorderSettings");
LbSettings = resourceManager.GetString("LbSettings");
LbBorderDisabled = resourceManager.GetString("LbBorderDisabled"); LbBorderDisabled = resourceManager.GetString("LbBorderDisabled");
LbBorderSolid = resourceManager.GetString("LbBorderSolid"); LbBorderSolid = resourceManager.GetString("LbBorderSolid");
LbBorderRainbow = resourceManager.GetString("LbBorderRainbow"); LbBorderRainbow = resourceManager.GetString("LbBorderRainbow");

View File

@ -124,7 +124,7 @@ namespace WpfMaiTouchEmulator.Resources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Solid (#AARRGGBB). /// Looks up a localized string similar to Solid.
/// </summary> /// </summary>
internal static string LbBorderSolid { internal static string LbBorderSolid {
get { get {
@ -141,6 +141,15 @@ namespace WpfMaiTouchEmulator.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to COM Port.
/// </summary>
internal static string LbComPort {
get {
return ResourceManager.GetString("LbComPort", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Connection state. /// Looks up a localized string similar to Connection state.
/// </summary> /// </summary>
@ -276,6 +285,15 @@ namespace WpfMaiTouchEmulator.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Settings.
/// </summary>
internal static string LbSettings {
get {
return ResourceManager.GetString("LbSettings", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Drag. /// Looks up a localized string similar to Drag.
/// </summary> /// </summary>

View File

@ -139,11 +139,14 @@
<value>境界線設定</value> <value>境界線設定</value>
</data> </data>
<data name="LbBorderSolid" xml:space="preserve"> <data name="LbBorderSolid" xml:space="preserve">
<value>単色#AARRGGBB</value> <value>単色</value>
</data> </data>
<data name="lbButtonState" xml:space="preserve"> <data name="lbButtonState" xml:space="preserve">
<value>ボタン状態</value> <value>ボタン状態</value>
</data> </data>
<data name="LbComPort" xml:space="preserve">
<value>COMポート</value>
</data>
<data name="lbConnectionState" xml:space="preserve"> <data name="lbConnectionState" xml:space="preserve">
<value>接続状態</value> <value>接続状態</value>
</data> </data>
@ -189,6 +192,9 @@
<data name="lbSentData" xml:space="preserve"> <data name="lbSentData" xml:space="preserve">
<value>送信データ</value> <value>送信データ</value>
</data> </data>
<data name="LbSettings" xml:space="preserve">
<value>設定</value>
</data>
<data name="LbTouchPanelDrag" xml:space="preserve"> <data name="LbTouchPanelDrag" xml:space="preserve">
<value>ドラッグ</value> <value>ドラッグ</value>
</data> </data>

View File

@ -139,11 +139,14 @@
<value>Border Settings</value> <value>Border Settings</value>
</data> </data>
<data name="LbBorderSolid" xml:space="preserve"> <data name="LbBorderSolid" xml:space="preserve">
<value>Solid (#AARRGGBB)</value> <value>Solid</value>
</data> </data>
<data name="lbButtonState" xml:space="preserve"> <data name="lbButtonState" xml:space="preserve">
<value>Button State</value> <value>Button State</value>
</data> </data>
<data name="LbComPort" xml:space="preserve">
<value>COM Port</value>
</data>
<data name="lbConnectionState" xml:space="preserve"> <data name="lbConnectionState" xml:space="preserve">
<value>Connection state</value> <value>Connection state</value>
</data> </data>
@ -189,6 +192,9 @@
<data name="lbSentData" xml:space="preserve"> <data name="lbSentData" xml:space="preserve">
<value>Sent</value> <value>Sent</value>
</data> </data>
<data name="LbSettings" xml:space="preserve">
<value>Settings</value>
</data>
<data name="LbTouchPanelDrag" xml:space="preserve"> <data name="LbTouchPanelDrag" xml:space="preserve">
<value>Drag</value> <value>Drag</value>
</data> </data>

View File

@ -139,11 +139,14 @@
<value>境界線設定</value> <value>境界線設定</value>
</data> </data>
<data name="LbBorderSolid" xml:space="preserve"> <data name="LbBorderSolid" xml:space="preserve">
<value>纯色#AARRGGBB</value> <value>纯色</value>
</data> </data>
<data name="lbButtonState" xml:space="preserve"> <data name="lbButtonState" xml:space="preserve">
<value>按钮状态</value> <value>按钮状态</value>
</data> </data>
<data name="LbComPort" xml:space="preserve">
<value>COM端口</value>
</data>
<data name="lbConnectionState" xml:space="preserve"> <data name="lbConnectionState" xml:space="preserve">
<value>连接状态</value> <value>连接状态</value>
</data> </data>
@ -189,6 +192,9 @@
<data name="lbSentData" xml:space="preserve"> <data name="lbSentData" xml:space="preserve">
<value>已发送数据</value> <value>已发送数据</value>
</data> </data>
<data name="LbSettings" xml:space="preserve">
<value>设置</value>
</data>
<data name="LbTouchPanelDrag" xml:space="preserve"> <data name="LbTouchPanelDrag" xml:space="preserve">
<value>拖动</value> <value>拖动</value>
</data> </data>

View File

@ -21,6 +21,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="System.Drawing.Common" Version="9.0.0" /> <PackageReference Include="System.Drawing.Common" Version="9.0.0" />
<PackageReference Include="System.IO.Ports" Version="9.0.0" /> <PackageReference Include="System.IO.Ports" Version="9.0.0" />
<PackageReference Include="WPF-UI" Version="3.0.5" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>