Avalonia 11.1 已知问题 应用启动时 PointToScreen 无法获取正确坐标

news/2024/11/16 5:58:05/文章来源:https://www.cnblogs.com/lindexi/p/18351896

本文记录 Avalonia 11.1 版本的已知问题,在 Linux 上使用 X11 时,在应用启动时,即使在 Loaded 或 Activated 事件里,都无法使用 PointToScreen 获取到正确的屏幕坐标,只会将传入的点作为返回值

此问题已经报告给 Avalonia 官方,请看 https://github.com/AvaloniaUI/Avalonia/issues/16622

如以下代码所示

    public MainWindow(){InitializeComponent();Loaded += MainWindow_Loaded;Activated += MainWindow_Activated;}private void MainWindow_Activated(object? sender, EventArgs e){var pointToScreen = this.PointToScreen(new Point(0, 0));Console.WriteLine($"MainWindow_Activated PointToScreen={pointToScreen}");}private void MainWindow_Loaded(object? sender, Avalonia.Interactivity.RoutedEventArgs e){var pointToScreen = this.PointToScreen(new Point(0, 0));Console.WriteLine($"MainWindow_Loaded PointToScreen={pointToScreen}");}

将以上代码运行在 X11 上,将无法在 Loaded 或 Activated 事件里使用 PointToScreen 获取到正确的屏幕坐标

运行以上代码在 X11 上将会在控制台有以下信息

MainWindow_Loaded PointToScreen=0, 0
MainWindow_Activated PointToScreen=0, 0

如果此时在 MainWindow_Loaded 添加 Task.Delay 一秒即可拿到正确的屏幕坐标

    private async void MainWindow_Loaded(object? sender, Avalonia.Interactivity.RoutedEventArgs e){var pointToScreen = this.PointToScreen(new Point(0, 0));Console.WriteLine($"MainWindow_Loaded PointToScreen={pointToScreen}"); // It can not get the correct coordinates here!await Task.Delay(1000);pointToScreen = this.PointToScreen(new Point(0, 0));Console.WriteLine(pointToScreen); // It can get the correct coordinates.}

以上问题我在 UOS 统信系统和 Kylin 麒麟系统上都进行测试,且通过分析代码可以了解到此问题与系统没有相关性。即不是 UOS 统信系统和 Kylin 麒麟系统挖的坑

此问题原因是在 Avalonia 里面依赖当前窗口坐标进行 PointToScreen 的计算,而坐标是在 X11 的 ConfigureNotify 事件里面更新的,这就意味着在窗口 Loaded 或 Activated 事件里还没有完成坐标的更新,从而导致无法正确计算屏幕坐标

由于窗口坐标更新将会触发 PositionChanged 事件,如果想要规避此问题,可以将在 Loaded 事件执行的 PointToScreen 方法尝试更改为 PositionChanged 执行,如下面代码

    public MainWindow(){InitializeComponent();PositionChanged += MainWindow_PositionChanged;}private void MainWindow_PositionChanged(object? sender, PixelPointEventArgs e){var pointToScreen = this.PointToScreen(new Point(0, 0));Console.WriteLine($"PositionChanged PointToScreen={pointToScreen}");}

必须说明的是 PositionChanged 和 Loaded 是完全不相同的时机,还请大家根据自己的业务进行修改

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

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

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 7036c43bcea5d9057dcddfea7ff3ef7aae84dc07

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

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 7036c43bcea5d9057dcddfea7ff3ef7aae84dc07

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

更多 Avalonia 相关博客,请参阅 博客导航

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

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

相关文章

乌龟对对碰开局应该抽几只?

结论:30只以上为佳,3的倍数 https://www.bilibili.com/video/BV17nYVekEWU/?vd_source=9b97428fe30142d2bb4f9bab6ef082a4# Import necessary libraries import numpy as np import random from collections import defaultdict import matplotlib.pyplot as plt# Function …

写一个cpp uos系统

#include <iostream>int main() {std::cout << "Hello, UOS!" << std::endl;return 0; }创建一个test.cpp文件, 在当前目录打开终端, 把上面代码内容写里面, 输入g++ test.cpp, 生成了一个a.out文件, ./a.out 输出 Hello, UOS!

C#项目—彩票选号

C#彩票选号软件 今天做了一个彩票选号的小软件,将学到的知识点总结如下; 1.写程序的思路实体类(属性、方法) 主程序调用类方法2.学到的知识点判断、循环 文件的操作(保存、打开) 集合、数组(增加-AddRange、删除-RemoveAt、排序-Reverse) 关键字:Random(随机数-Next)…

C#学习——彩票选号软件

C#彩票选号软件 今天做了一个彩票选号的小软件,将学到的知识点总结如下; 1.写程序的思路实体类(属性、方法) 主程序调用类方法2.学到的知识点判断、循环 文件的操作(保存、打开) 集合、数组(增加-AddRange、删除-RemoveAt、排序-Reverse) 关键字:Random(随机数-Next)…

探究grid_sample函数

一、函数介绍torch.nn.functional.grid_sample(input, grid, mode=bilinear, padding_mode=zeros, align_corners=None)对于4D输入,input维度为 \((N,C,H_{in},W_{in})\), grid维度为 \((N,H_{out},W_{out},2)\) ,则output维度为 \((N,C,H_{out},W_{out})\)对于5D输入,input…

036.CI4框架CodeIgniter,VUE+CI4互通,VUE通过伪静态地址访问,内容为调用的CI4的API

CI4和VUE前端代码,可以看我在https://www.cnblogs.com/tianpan2019写的前2篇运行CI4能正常打开 使用npm run dev 也可以正常打开VUE 根据https://www.cnblogs.com/tianpan2019前1篇把根目录设置成CI4的publi目录 把伪静态内容也写上,内容如下:location / { if (!-e $reques…

2024年1000个计算机毕业设计项目源码(源码+论文【万字】)

【计算机毕设项目】2025级100个热门项目推荐 (前后端Web项目) 以下项目选题适合计算机专业大部分专业,技术栈主要为:Java语言,SpringBoot+Vue框架,MySQL数据库以下项目选题适合计算机专业大部分专业,技术栈主要为:Java语言,SpringBoot+Vue框架,MySQL数据库 ①后台免费获…

035.CI4框架CodeIgniter,安装前端VUE并执行

安装node22.5 选择路径 安装完成 装好后使用cmd查看node -v和 npm -v,看一下就知道有没有装好了 nodejs的安装目录,需要完全授权才可以,不然后面会报错 在网站的根目录,打开Powershell 显示权限不足的错误 管理员模式打开系统的Powershell 输入set-ExecutionPolicy RemoteS…

7月编程心得

7 月份非常忙碌,想系统性的写一篇文章,好几次不知道如何下手,后来想想还不如顺其自然,写一点自己的学习心得体会。 这篇文章,聊聊 7月份笔者的编程心得 ,希望对大家有所帮助。 1 IntelliJ IDEA 社区版 工欲善其事,必先利其器。 笔者的 Mac 电脑安装了 IntelliJ IDEA Ult…

三分钟对可视化表单设计器开源优点做简单介绍

为了帮助大家了解可视化表单设计器开源的多个优势特点,本文将为大家做一个系统介绍。想要实现流程化办公,需要了解低代码技术平台、可视化表单设计器开源在现代化办公中的作用和价值。为了帮助大家了解可视化表单设计器开源的多个优势特点,本文将为大家做一个系统介绍。 要了…

校园集市小程序开发-系统架构与Django后端

引子: 烂尾就烂尾吧,大不了以后自己创业。唉,也算给自己一个警戒。E-R模型接口设计数据模型设计 基本模型放在models.py中 class School(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=100, verbose_name=学校名称) # 学校校区 …

基于MPPT最大功率跟踪算法的光伏并网发电系统simulink仿真

1.课题概述基于MPPT最大功率跟踪算法的光伏并网发电系统simulink仿真,包括PV模型建模(不使用simulink自带的PV模块,根据公式进行建模),MPPT最大功率控制器,PI控制器,锁相环,逆变器等等。输出系统的收敛曲线。2.系统仿真结果 上面三个波形分别表示光伏并网输出的Ipv,Upv和…