不知道哪来的想法,想用Win11新的UI写一个串口助手,于是前几天就开始了。
这张图是目前的状态:

目前只是简单地把控件摆到窗口中,控件的功能没写,窗口还有很多谜之问题。
装了个WinUI3画廊,跟着微软的教程复制粘贴了一个简易笔记程序,非常简陋但确实是个能用的程序:

这个过程花了大概一晚上,前后操作了两遍,第一遍是一边复制一遍做一些修改,结果发现后期的功能实现不了,陷入了两边比对代码问题的困境……第二遍就照着教程抄,只格式化代码,终于实现了教程的功能。
不过搞的时候发现,这程序功能倒没多少,内存占的真多啊,调试里面说占用大于100MB,任务管理器看这个单独进程就占了将近40MB,跟着教程写的那问题应该不是出在我这里,经过简单查找,发现这应该就是WinUI框架的问题,资源占用太高了……(现在突然明白Win11性能为什么这么差了)
隔天下午磕磕绊绊写了个窗口上位机UI,总结了一点内容:
空模板出现的窗口带系统默认状态栏,要手动隐藏:
1 2 3 4 5 6 7
|
ExtendsContentIntoTitleBar = true;
SetTitleBar(AppTitleBar);
|
设置窗口大小的方法:
1 2 3 4 5 6 7 8
|
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(this); var windowId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(hwnd); var appWindow = Microsoft.UI.Windowing.AppWindow.GetFromWindowId(windowId);
appWindow.Resize(new Windows.Graphics.SizeInt32(800, 500));
|
普通ComboBox控件举例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <!-- 校验位 --> <StackPanel Orientation="Horizontal" Spacing="4"> <TextBlock Text="校验位" VerticalAlignment="Center" Style="{StaticResource BodyTextBlockStyle}" /> <ComboBox HorizontalAlignment="Stretch" Width="130" SelectedIndex="0" > <ComboBoxItem>无</ComboBoxItem> <ComboBoxItem>奇校验</ComboBoxItem> <ComboBoxItem>偶校验</ComboBoxItem> </ComboBox> </StackPanel> <!-- 校验位 -->
|
可以自由输入的ComboBox控件举例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <!-- 波特率 --> <StackPanel Orientation="Horizontal" Spacing="4"> <TextBlock Text="波特率" VerticalAlignment="Center" Style="{StaticResource BodyTextBlockStyle}" /> <ComboBox HorizontalAlignment="Stretch" x:Name="BaudRateComboBox" Width="130" IsEditable="True" SelectedIndex="1" > <ComboBoxItem>4800</ComboBoxItem> <ComboBoxItem>9600</ComboBoxItem> <ComboBoxItem>38400</ComboBoxItem> <ComboBoxItem>115200</ComboBoxItem> </ComboBox> </StackPanel> <!-- 波特率 -->
|
读取设备串口号的ComboBox控件及后端代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <!-- 串口号 --> <StackPanel Orientation="Horizontal" Spacing="4"> <TextBlock Text="串口号" VerticalAlignment="Center" Style="{StaticResource BodyTextBlockStyle}" /> <ComboBox PlaceholderText="选择串口" HorizontalAlignment="Stretch" Width="130" x:Name="PortComboBox" > </ComboBox> </StackPanel> <!-- 串口号 -->
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| using System.IO.Ports;
protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e);
var ports = SerialPort.GetPortNames();
PortComboBox.ItemsSource = ports; }
|
这么写是有问题的,程序只会在窗口加载时获取串口列表,不过这个之后写后端代码的时候再改。
目前这个上位机程序要用到的控件都摆好了,但是窗口存在问题:
1.左右拉伸窗口会有明显残影。
2.从状态栏拉伸窗口不会实时更新。
3.无法限制窗口大小(试过很多网上的代码和AI生成的代码)
于是我在B站发了个视频,有大佬回复表示问题1是WinUI框架本身现存的问题(笑),问题2是我自己没处理好,问题3要用Win32接口或者第三方库WinUIEx。等有时间我再解决吧(笑)。
【本文完】