启动居中 + 最小化到托盘(无闪烁)修复记录
本文记录本次关于“wpf应用启动时窗口居中,且在启用启动最小化时直接最小化到托盘(无任何可见闪烁与缩略窗)”的排查与修复过程,供日后参考。
该软件的功能类似《基于MFC实现的快速输入小工具》,当然这不重要,软件是修复过程的一个参照。

问题现象
- 启动勾选“启动最小化”后,窗口会出现以下不良体验:
- 先在屏幕左上角闪现,之后居中,再最小化到托盘。
- 某些方案会出现黑块(透明度/布局期间的绘制)。
- 也有方案会在任务栏左下角出现最小化缩略窗(而非直接进入系统托盘)。
- 期望行为:
- 启动最小化开启时,应用应直接最小化到系统托盘,不占用任务栏,也不出现左下角缩略窗;
- 从托盘恢复时,窗口应居中显示;
- 启动未勾选最小化时,窗口应“直接居中显示”,且无居中过程的可见动画/闪烁。
根因分析
- 传统做法在
Loaded或Shown时再调整位置与状态,期间窗口已可见,导致“左上角→居中→最小化”的可见过程。 - 使用
WindowState = Minimized启动,会让系统创建任务栏最小化缩略窗(左下角出现)。 - 使用透明度(Opacity=0)在某些显卡/主题上可能出现绘制黑块,且仍可能看到状态变化过程。
关键改动概览
涉及文件:
App.xaml.csMainWindow.xaml.csServices/TrayService.cs- (已有)
publish.ps1
1) App.xaml.cs:启动最小化路径的“无可见”初始化
位置:Application_Startup 内部
变更点:
- 启动时提前加载设置:
var storage = new StorageService(); startupSettings = storage.LoadSettings(); - 根据
StartMinimized决定两条启动路径:- 非最小化:正常
mw.Show()(此时MainWindow会自行确保居中)。 - 启动最小化:
- 标记
mw.StartMinimizedHandled = true,避免MainWindow_Loaded再次隐藏引发闪烁; - 将窗口放到屏幕外侧,禁止任务栏显示、禁止激活:
mw.WindowStartupLocatio
- 标记
- 非最小化:正常

最低0.47元/天 解锁文章
1938

被折叠的 条评论
为什么被折叠?



