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

2018 年 8 月 18 日

如果你的信息来源仅限于互联网,你可能会觉得,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 编写的。你可以通过以下几种方式实现:

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

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

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

2018 年 8 月 18 日 03:461078
用户头像

发布了 1008 篇内容, 共 307.1 次阅读, 收获喜欢 272 次。

关注

评论

发布
暂无评论
发现更多内容

5. Bean Validation声明式验证四大级别:字段、属性、容器元素、类

YourBatman

Hibernate-Validator Bean Validation 数据校验

Consistent Hashing算法实现 - JavaScript

10月24日,“网安小酒馆”线上活动开启,有红包,更有名酒相送

Cloudaemon

环信入选2020在线教育视频云创新排行TOP10

DT极客

JVM系列笔记 - 虚拟机栈

朱华

JVM

前端科普系列(5):ESLint - 守住优雅的护城河

vivo互联网技术

Java 前端 代码仓库

让“物”能说会道,揭晓华为云IOT黑科技

华为云开发者社区

物联网 华为云

一文快速入门分库分表中间件 Sharding-JDBC (必修课)

程序员内点事

Java 分库分表

独家揭秘 | 京东物流Elasticsearch大规模“迁移上云”实践

京东智联云开发者

云计算

iOS touch事件点的获取

teoking

ios

JMM 应用实例:单例模式

朱华

单例模式

使用Hugo和GitHub搭建博客

Félix

GitHub GitHub Pages Blog Hugo

LAXCUS 大数据集群操作系统:一个分布式分时共享 E 级系统软件(五)

陈泽云

人工智能 数据库 大数据 操作系统

两个程序员老友的会面

Learun

敏捷开发

架构师训练营 - 第 5 周课后作业(1 期)

Pudding

架构师训练第五周 -编程语言实现一致性 hash 算法

郎哲158

配置企业应用业务流程别头大,有工作流引擎就不怕

Marilyn

敏捷开发

mongodb源码实现系列-网络传输层模块实现二

杨亚洲(专注mongodb及高性能中间件)

MySQL 数据库 mongodb 高性能 分布式数据库mongodb

1024丨奈学教育致敬程序员:‘3+2’战略发布会圆满落幕

奈学教育

奈学教育 程序员节

非阻塞的无界线程安全队列 —— ConcurrentLinkedQueue

程序员小航

Java 源码 并发 源码阅读 JUC

区块链数字货币交易所开发,交易系统搭建方案

WX13823153201

Docker内部组件

混沌畅想

Docker 容器 运维

算法图解:如何用两个栈实现一个队列?

王磊

Java 数据结构 算法和数据结构

中台架构下的DDD和落地实践

高鹏

业务中台 DDD 领域驱动模型DDD 中台架构 中台架构 DDDplus

万字长文深入理解java中的集合-附PDF下载

程序那些事

java编程 JAVA集合 java集合总结 java集合使用 java秘籍

Go发起HTTP2.0请求流程分析(后篇)——标头压缩

新世界杂货铺

golang 后端开发 HTTP2.0

低代码开发平台,真的是为了“干掉“程序员嘛?

力软.net/java开发平台

软件开发 低代码

架构训练营 - 第5周课后作业 - 学习总结

Pudding

超越视觉支持语音新版OpenVINO发布,为更多智能边缘开发者赋能

intel001

这个应用魔方厉害了,让软件开发者效率提升10倍

华为云开发者社区

软件开发 代码

1024丨奈学教育致敬程序员:‘3+2’战略发布会圆满落幕

古月木易

奈学教育

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