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(可用区域)、Dpi、Scale(缩放因子,如 1.5)、Id(平台相关标识) -
Bounds和WorkingArea单位是 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多数据库连接配置与切换教程
网站制作软件有哪些,制图软件有哪些?


reens.All遍历所有屏幕;物理像素需用Scale换算;支持ScreenCountChanged等事件监听热插拔与DPI变化。