C# Avalonia怎么获取屏幕分辨率 Avalonia Screen信息

发布时间 - 2025-12-29 00:00:00    点击率:
在Avalonia中通过Screen类和Screens静态集合跨平台获取屏幕信息:Screens.Primary获取主屏DIP尺寸、DPI、WorkingArea;Screens.All遍历所有屏幕;物理像素需用Scale换算;支持ScreenCountChanged等事件监听热插拔与DPI变化。

在 Avalonia 中获取屏幕分辨率和屏幕信息,主要通过 Screen 类和 Screens 静态集合实现。它不依赖 Win32 或平台特定 API,而是跨平台统一抽象(支持 Windows、macOS、Linux),但底层行为会因平台而异。

获取主屏幕分辨率

最常用的是获取当前主显示器的尺寸(通常为应用所在屏幕):

  • 使用 Avalonia.Controls.TopLevel.GetTopLevel(this) 获取当前窗口所在的顶层控件
  • 调用 .Screens.ScreenFromPoint(...) 或直接访问 .Screens.Primary

示例代码:

var topLevel = TopLevel.GetTopLevel(this);
if (topLevel?.Screens is { } screens)
{
    var primary = screens.Primary;
    var dpi = primary.Dpi; // DPI 缩放比例(如 96, 144, 192)
    var bounds = primary.Bounds; // 设备无关像素(DIP)坐标和大小
    var workingArea = primary.WorkingArea; // 排除任务栏/菜单栏后的可用区域
    var resolution = new PixelSize(bounds.Width, bounds.Height); // DIP 尺寸
}

获取所有屏幕列表及详细信息

适用于多屏场景,比如让窗口居中到某块屏、或动态适配不同分辨率屏幕:

  • Screens.All 返回所有已连接屏幕的只读集合
  • 每个 Screen 包含 Bounds(总区域)、WorkingArea(可用区域)、DpiScale(缩放因子,如 1.5)、Id(平台相关标识)
  • BoundsWorkingArea 单位是 DIP(设备无关像素),不是物理像素

示例:

foreach (var screen in Screens.All)
{
    Console.WriteLine($"ID: {screen.Id}");
    Console.WriteLine($"Bounds: {screen.Bounds}");
    Console.WriteLine($"WorkingArea: {screen.WorkingArea}");
    Console.WriteLine($"DPI: {screen.Dpi}, Scale: {screen.Scale}");
}

获取物理像素分辨率(需手动换算)

Avalonia 默认使用 DIP,若需真实像素(如截图、OpenGL 渲染上下文),需结合 Scale 换算:

  • physicalWidth = (int)Math.Round(bounds.Width * screen.Scale)
  • physicalHeight = (int)Math.Round(bounds.Height * screen.Scale)
  • 注意:不同平台 Scale 含义略有差异(如 macOS 使用逻辑缩放,Linux X11 可能为 1.0)

监听屏幕变化(热插拔、DPI 改变)

屏幕列表支持响应式更新,可订阅事件:

  • Screens.ScreenCountChanged:屏幕增减(如插入/拔出显示器)
  • Screens.PropertyChanged:某些平台可能触发 DPI 或布局变更(非所有平台都完全支持)

建议在 OnAttachedToVisualTree 或窗口初始化后订阅,并在销毁时取消订阅。


# linux  # windows  # 显示器  # mac  # macos  # win  # c#  # cos  # math  # int  # 事件  # this  # 的是  # 热插拔  # 遍历  # 适用于  # 并在  # 能为  # 它不  # 最常用  # 任务栏  # 需用 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何快速生成专业多端适配建站电话?  北京企业网站设计制作公司,北京铁路集团官方网站?  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  轻松掌握MySQL函数中的last_insert_id()  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何在万网自助建站平台快速创建网站?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  php485函数参数是什么意思_php485各参数详细说明【介绍】  详解Android——蓝牙技术 带你实现终端间数据传输  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  如何挑选优质建站一级代理提升网站排名?  🚀拖拽式CMS建站能否实现高效与个性化并存?  如何彻底卸载建站之星软件?  lovemo网页版地址 lovemo官网手机登录  如何在服务器上三步完成建站并提升流量?  如何将凡科建站内容保存为本地文件?  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  米侠浏览器网页背景异常怎么办 米侠显示修复  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  佛山企业网站制作公司有哪些,沟通100网上服务官网?  网站建设保证美观性,需要考虑的几点问题!  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Android自定义控件实现温度旋转按钮效果  Laravel如何配置和使用缓存?(Redis代码示例)  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  如何在景安云服务器上绑定域名并配置虚拟主机?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  Laravel如何发送系统通知?(Notification渠道示例)  Swift中循环语句中的转移语句 break 和 continue  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  php 三元运算符实例详细介绍  如何在Windows 2008云服务器安全搭建网站?  如何在腾讯云服务器快速搭建个人网站?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  nodejs redis 发布订阅机制封装实现方法及实例代码  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  教你用AI润色文章,让你的文字表达更专业  如何在云主机上快速搭建多站点网站?  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  网站制作软件有哪些,制图软件有哪些?