Wpf程序屏幕居中问题修复全记录

wpf屏幕居中的问题,本来是一个比较简单的问题,但有的时候引入了比较复杂的情况,比如副屏,缩放DPI不同,甚至主屏和副屏不同的DPI等等,因而需要检查多种情况。

此次记录了整个修复过程,为日后遇到类似的问题参考。

此次修复过程解决了HotkeyPaster应用在多显示器环境下窗口居中的一系列问题,特别是与不同DPI缩放有关的显示异常。

问题一:初始窗口居中问题

问题原因 :MainWindow.xaml中存在硬编码的窗口大小属性,与代码中的窗口大小设置产生冲突,导致窗口无法正确居中。

修复措施 :

  1. 移除MainWindow.xaml中硬编码的窗口大小属性

  2. 增强MainWindow.xaml.cs中的ApplyWindowSettings方法:

  • 调整窗口大小与位置设置的顺序

  • 添加窗口已加载时手动计算居中位置的逻辑

  • 增加调试日志以便追踪问题

  1. 首次发布应用程序到publish目录验证修复效果

问题二:副屏DPI缩放导致窗口居中失效

问题原因 :原始窗口居中逻辑仅使用PrimaryScreenWidth和PrimaryScreenHeight计算主屏幕居中位置,未考虑多显示器环境和不同DPI缩放因素。

修复措施 :

  1. 在MainWindow.xaml.cs中新增CenterWindowOnCurrentScreen方法:
  • 使用System.Windows.Forms.Screen类获取目标屏幕(窗口所在或鼠标位置屏幕)

  • 实现考虑DPI缩放的居中位置计算

  • 在窗口未加载时注册Loaded事件确保居中逻辑执行

  1. 修改ApplyWindowSettings方法调用新的居中方法

  2. 确认项目已引用System.Windows.Forms程序集(通过检查HotkeyPaster.csproj中的true配置)

  3. 构建并发布应用程序验证修复效果

问题三:副屏窗口位置偏右下角(DPI缩放计算精确性问题)

问题原因 :尽管实现了多显示器支持,但居中计算逻辑仍存在问题,特别是在DPI缩放环境下窗口位置转换不准确。

修复措施 :

  1. 优化CenterWindowOnCurrentScreen方法的计算逻辑:
  • 新增窗口大小调试日志便于排查

  • 修改居中逻辑:先计算屏幕物理中心点,再转换为WPF逻辑坐标

  • 精确计算窗口左上角位置(屏幕中心减去窗口半宽高)

  • 添加边界检查确保窗口位置有效,防止窗口超出屏幕范围

  • 增强调试日志输出,记录详细的屏幕信息、DPI缩放因子和计算过程

  1. 使用PresentationSource.FromVisual获取准确的DPI缩放因子

  2. 构建并发布优化后的应用程序 最终验证

通过多次构建和发布应用程序到publish目录,确认所有窗口居中问题已得到完美解决:

  • 主屏幕窗口能够正确居中显示

  • 副屏幕窗口能够准确居中,不再出现偏右下角的情况

  • 应用在不同DPI缩放比例的显示器上都能正确适应

此次修复不仅解决了具体问题,还通过增强调试日志、添加边界检查等措施提高了代码的健壮性和可维护性。

相关推荐
赵财猫._.4 小时前
HarmonyOS内存优化实战:泄漏检测、大对象管理与垃圾回收策略
华为·wpf·harmonyos
赵财猫._.4 小时前
鸿蒙超级终端体验:无缝流转的底层实现与用户体验优化
wpf·harmonyos·ux
故事不长丨4 小时前
C#委托的使用
c#·wpf·winfrom·委托·网站开发
行走正道7 小时前
【探索实战】跨云应用分发自动化实战:基于Kurator的统一交付体系深度解析
运维·自动化·wpf·kurator·跨云分发
Macbethad11 小时前
基于WPF的Ethernet/IP主站程序技术方案
网络协议·tcp/ip·wpf
张人玉15 小时前
Prism Template Pack 完整使用示例(VS2022 + .NET 8 + DryIoc)
.net·wpf·prism
棉晗榜15 小时前
wpf 在XAML中配置视图模型,通过 d:DataContext设置设计时类型,方便按F12跳转查看类型
wpf
赵财猫._.18 小时前
HarmonyOS渲染性能优化:组件树复用与局部刷新机制
wpf·harmonyos·ux
赵财猫._.18 小时前
鸿蒙分布式数据库同步:冲突解决与数据一致性策略
wpf·harmonyos·ux
Macbethad1 天前
使用WPF编写一个数据记录页面
wpf