初学WinUI3

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

这张图是目前的状态:
串口助手UI
目前只是简单地把控件摆到窗口中,控件的功能没写,窗口还有很多谜之问题。

装了个WinUI3画廊,跟着微软的教程复制粘贴了一个简易笔记程序,非常简陋但确实是个能用的程序:
WinUINote
这个过程花了大概一晚上,前后操作了两遍,第一遍是一边复制一遍做一些修改,结果发现后期的功能实现不了,陷入了两边比对代码问题的困境……第二遍就照着教程抄,只格式化代码,终于实现了教程的功能。

不过搞的时候发现,这程序功能倒没多少,内存占的真多啊,调试里面说占用大于100MB,任务管理器看这个单独进程就占了将近40MB,跟着教程写的那问题应该不是出在我这里,经过简单查找,发现这应该就是WinUI框架的问题,资源占用太高了……(现在突然明白Win11性能为什么这么差了)

隔天下午磕磕绊绊写了个窗口上位机UI,总结了一点内容:

空模板出现的窗口带系统默认状态栏,要手动隐藏:

1
2
3
4
5
6
7
// 主窗口后端
/*********** 窗口状态栏 ***********/
// 隐藏默认系统状态栏
ExtendsContentIntoTitleBar = true;
// 用 WinUI TitleBar 替换状态栏
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控件举例:
普通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控件举例:
可以自由输入的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();

// 绑定到ComboBox
PortComboBox.ItemsSource = ports;
}
/*********** 在页面加载时获取串口列表 ***********/

这么写是有问题的,程序只会在窗口加载时获取串口列表,不过这个之后写后端代码的时候再改。

目前这个上位机程序要用到的控件都摆好了,但是窗口存在问题:
1.左右拉伸窗口会有明显残影。
2.从状态栏拉伸窗口不会实时更新。
3.无法限制窗口大小(试过很多网上的代码和AI生成的代码)

于是我在B站发了个视频,有大佬回复表示问题1是WinUI框架本身现存的问题(笑),问题2是我自己没处理好,问题3要用Win32接口或者第三方库WinUIEx。等有时间我再解决吧(笑)。

【本文完】


初学WinUI3
https://mrwei95.github.io/2026/01/02/WinUI3-FirstStep/
作者
Tommy Wei
发布于
2026年1月2日
更新于
2026年1月3日