Avalonia 11.1 获取平台调用的窗口的方法

news/2024/11/17 23:51:37/文章来源:https://www.cnblogs.com/lindexi/p/18350133

本文和大家介绍如何在 11.1 版本的 Avalonia 里获取平台调用的窗口的方法,如 Windows 获取窗口句柄,在 Linux 下获取 X11 的 xid 窗口信息

在拿到任意的 Avalonia 的 Visual 元素,可通过 TopLevel 的 GetTopLevel 方法获取到其窗口。由于 Avalonia 是一个跨平台的 UI 框架,因此不能假定一定存在窗口,于是这里的 GetTopLevel 只是返回一个名为 TopLevel 的对象

在桌面平台里,这里的 TopLevel 对象就是窗口对象

获取到 TopLevel 对象之后,即可再调用 TryGetPlatformHandle 方法,尝试获取平台信息,代码如下

        var topLevel = TopLevel.GetTopLevel(this)!;// 通过窗口获取,方法更加简单:var handle = topLevel.TryGetPlatformHandle()!;Console.WriteLine($"X11 xid {handle.Handle}");

除了以上方法之外,还可以反射 PlatformImpl 获取。其代码实现如下

        var platformImpl = topLevel.PlatformImpl;var type = platformImpl.GetType();var propertyInfo = type.GetProperty("Handle", BindingFlags.Instance | BindingFlags.Public);var value = propertyInfo.GetValue(platformImpl);Debug.Assert(value is IPlatformHandle);if (value is PlatformHandle platformHandle){var x11Handler = platformHandle.Handle;Console.WriteLine(x11Handler);}else if(value is IPlatformHandle platformHandle2){// 当前在 Windows 的没有明确的类型,是一个放在 WindowImpl 类中的 WindowImplPlatformHandle 内部类var hwnd = platformHandle2.Handle;Console.WriteLine(hwnd);}

通过以上代码可以看到 Avalonia 实现的不一致,在 Windows 下的实现里面,没有明确的 PlatformHandle 类型

好在后续版本已经对此进行变更,允许从 PlatformImpl 属性直接获取 Handle 属性,如此设计将会更加预期。也就是意味着在 11.1 之后的版本,预期可以不用写反射,即可直接从 PlatformImpl 属性获取到 Handle 属性

以上代码使用反射获取到的 Handle 和 TryGetPlatformHandle 获取到的是相同的

本文代码放在 github 和 gitee 上,可以使用如下命令行拉取代码。我整个代码仓库比较庞大,使用以下命令行可以进行部分拉取,拉取速度比较快

先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 5b958b3dc584ebf34351c4c0015bce17bb5b05d4

以上使用的是国内的 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码,可以发邮件向我要代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 5b958b3dc584ebf34351c4c0015bce17bb5b05d4

获取代码之后,进入 AvaloniaIDemo/NaiqojunefeakeeLurkarlabefije 文件夹,即可获取到源代码

更多技术博客,请参阅 博客导航

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/780134.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

milvus日常管理

1.创建用户 create user -u hxl -p Milvus 让需要在auut界面赋予账号权限

违法高发提醒

3 违法地点:京藏高速辅路上清桥南(长期高发地) 违法行为:机动车违反禁止标线指示的

保障速度与安全合规的前提下,如何传文件到国外?

伴随着经济全球化,数据跨境活动日益频繁,数据出境场景越来越多,防范数据出境安全风险,保障数据依法有序自由流动成为我国关注的重要方面。涉及数据出海的行业多种多样,像跨国运营、全球研发、金融服务等领域的企业都涉及传文件到国外,将数据资源、业务或技术应用扩展到海…

多线程学习总结

Java 多线程学习总结 本章目标理解线程的基本概念 理解线程与进程的区别 熟悉线程的实现方式 了解线程的管理 熟悉线程的生命周期 掌握线程同步 掌握线程池 了解线程通信 掌握线程定时器什么是进程 进程就是正在运行的程序,它是系统进行资源分配和调度的基本单位,各个进程之间…

AOP -面向切面编程

AOP -面向切面编程 aop是oop(面向对象编程)的补充和完善。oop是一种纵向开发,然而当面对需要一些横向的功能如日志,就会导致大量重复的代码。 aop利用横切把一些重复的非核心的代码插入到核心代码周围,不需要重复写很多遍。 应用场景:日志记录,在方法的执行前后插入日志…

OneKeyAdmin 后台任意文件下载

无它唯手熟尔,还是太菜了侵权声明 本文章中的所有内容(包括但不限于文字、图像和其他媒体)仅供教育和参考目的。如果在本文章中使用了任何受版权保护的材料,我们满怀敬意地承认该内容的版权归原作者所有。 如果您是版权持有人,并且认为您的作品被侵犯,请通过以下方式与我…

适合新手进行接口与自动化测试练习的推荐网站!!!

对于新手来说,接口与自动化测试练习网站是提升技能的重要资源。以下是一些适合新手进行接口与自动化测试练习的推荐网站: 1、httpbin.org httpbin.org是一个在线提供HTTP服务的网站,它提供了丰富的HTTP接口,用于测试HTTP请求和响应的各种信息,如cookie、IP、headers和登录…

《最新出炉》系列小成篇-Python+Playwright自动化测试-67 - 模拟手机浏览器兼容性测试

1.简介 在日常工作中,我们会遇到需要使用不同的硬件设备测试兼容性的问题,尤其是现在手机型号基本上是每个厂家每年发布一款新机型,而且手机的屏幕大小分辨率五花八门的,我们基本不可能全部机型都用真机测试一遍,playwright提供了模仿机型的功能,我们可以使用playwright来…

在IIS上部署ASP.NET Core Web API和Blazor Wasm详细教程

前言 前段时间我们完成了七天.NET 8 操作 SQLite 入门到实战的开发系列教程,有不少同学留言问如何将项目发布部署到IIS上面运行。本篇文章我们就一起来讲讲在IIS上部署ASP.NET Core Web API和Blazor Wasm。 前提条件 安装.NET Core SDKhttps://dotnet.microsoft.com/zh-cn/dow…

Sublime Text 4 如何配置成完美的OI编辑器,优雅的打比赛

Sublime Text 完整配置编译文件点击新建编译系统(Tools -> Build system -> New build system)改为以下代码: Ubuntu : {"encoding": "utf-8","working_dir": "$file_path","shell_cmd": "g++ \"$file_name…

打造个性化Typora写作体验的必备插件

该文档为 typora_plugin 的 README 文档,为了方便国内的同学阅读而转载到本博客。该文档为 typora_plugin 的 README 文档,为了方便国内的同学阅读而转载到本博客。 原文地址:https://github.com/obgnail/typora_plugin 插件地址:可以去 GitHub 上下载,也可以在我的公众号…