当前位置: 首页 > news >正文

通过XAML Islands使Windows桌面应用程序现代化

如果你的信息来源仅限于互联网,你可能会觉得,Windows桌面开发已经彻底完蛋了,但根据Visual Studio中的遥测数据,每个月有大约240万开发人员在积极地开发桌面应用程序,比20个月前增长了50%。有一个如此大的社区支持,微软正在寻找方法,帮助开发人员把那些资产整合进Windows 10。

\\

XAML Islands

\\

关于微软的Windows开发,其中一个最大的抱怨是微软在Winforms和WPF上投入少;Windows 10提供的大部分新特性都只是针对UWP构建的。虽然我们现在可以从.NET Framework调用UWP API,但仅适用于不涉及UI的情况。

\\

为了解决这个问题,微软创建了两个新控件:WinForms XAML Host和WPF XAML Host,使开发人员可以把为UWP编写的UI嵌入到现有的WinForms/WPF应用程序。

\\

UWP封装和Windows 7回退

\\

开发人员之所以继续使用WinForms或WPF,其中一个原因是为了支持Windows 7。后来,人们需要新推出的XAML Islands,这是因为它使得应用程序不在Windows 10上也可以正常运行。

\\

其中一个例子是现在已经可以使用的WebView。如果应用程序在Windows 10上运行,那么WebView就是Edge浏览器的宿主。如果是运行在Windows 7上,那么它就会加载IE浏览器控件。

\\

其他控件还处于规划阶段,包括MediaPlayer、InkCanvas/InkToolBar、Map和SwapChainPanel。

\\

空域

\\

把WinForms和WPF混合使用的开发人员都熟悉“空域(airspace)”的概念,它是用于处理在同一个窗口中来自不同UI框架的控件相互重叠的问题。

\\

在Win32开发中,屏幕上的每个对象自己都有一个在OS层面注册的窗口句柄(HWND)。HWND关联着屏幕上的一个矩形,对象可以在其中渲染其内容。一般来说,每个WinForms控件都会获得自己的HWND,而大多数WPF控件都共享整个窗口的HWND。

\\

对于XAML Islands(WinForms和WPF),HWND创建后供UWP控件使用。这会带来一些不明显的影响。例如,如果你旋转UWP控件,HWND不会随之旋转,也就是说,HWND需要更大一些才能为它提供空间。

\\\\

弹出式上下文菜单尤其难以处理。它们通常有自己的HWND,但是,该HWND不一定能够和XAML的HWND正确堆叠,导致菜单看上去在另一个控件后面。

\\

线程模型

\\

目前在UWP中,每个顶级窗口预计都有自己专有的UI线程。例如说,你有一个主-从视图,从视图是用UWP编写的。你可以通过以下几种方式实现:

\\
  • 从视图共享主视图的窗口:没问题。\\t
  • 从视图有自己的顶级窗口,不共享对象:没问题。\\t
  • 从视图有自己的顶级窗口,但和主视图共享对象:可能会有竞态条件、UI跨线程问题等。\

最终,这个问题将通过引入轻量级窗口来解决。

\\

查看英文原文:Modernizing Windows Desktop Applications with XAML Islands

相关文章:

  • apscheduler -定时任务
  • springmvc入门之映射处理器(二)
  • Bytom交易说明(账户管理模式)
  • 将java Bean转换成数据库Schema
  • 罗辑思维首席架构师:Go微服务改造实践
  • MVVM
  • 目标检测算法(1)目标检测中的问题描述和R-CNN算法
  • LVS + Keepalived 高可用群集部署
  • 【大数据】MapTask并行度和切片机制
  • WSTMart开源商城
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • 微服务架构eureka集群高可用配置
  • OSS访问控制介绍
  • Swift逆向之函数解码
  • Win2008/2012r2下批量更改域用户密码
  • 【React系列】如何构建React应用程序
  • 【翻译】babel对TC39装饰器草案的实现
  • Computed property XXX was assigned to but it has no setter
  • Flannel解读
  • java正则表式的使用
  • jQuery(一)
  • Linux后台研发超实用命令总结
  • Linux下的乱码问题
  • mongo索引构建
  • Zsh 开发指南(第十四篇 文件读写)
  • 给第三方使用接口的 URL 签名实现
  • 构建工具 - 收藏集 - 掘金
  • 记一次删除Git记录中的大文件的过程
  • 技术发展面试
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 温故知新之javascript面向对象
  • 详解移动APP与web APP的区别
  • 学习笔记:对象,原型和继承(1)
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #vue3 实现前端下载excel文件模板功能
  • (07)Hive——窗口函数详解
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Mysql的优化设置
  • (转)甲方乙方——赵民谈找工作
  • (转载)Linux网络编程入门
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET Core 2.1路线图
  • .NET 解决重复提交问题
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET企业级应用架构设计系列之应用服务器
  • .Net语言中的StringBuilder:入门到精通
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解