微软把UWP定位成业务线应用程序开发平台

微软把UWP定位成传统业务线(LOB)应用程序开发平台,以使用Windows Template Studio实现快速应用程序开发为重点。但是,为了把LOB开发人员吸引到UWP平台,他们在做的事情不止这些。

最初发布时,通用Windows平台(UWP)只是被视为一种在Windows商店中销售应用程序的方法。其基本思想是你编写一次应用程序,它就可以在Windows和Windows Phone上运行。但是有严格的限制,你几乎是必须通过Windows商店。对业务线(LOB)应用程序而言,这就不合适了,因为它们天生就不应该公开暴露。

借助UWP,LOB开发人员要么继续使用遗留的WinForms和WPF平台,通常是使用ClickOnce作为部署方法,要么接受内部Web站点额外的复杂度和开发成本。对于中大型企业,这个方向尤其流行,WinForms/WPF更高的部署成本是一个因素。

随着去年“Windows 10 Fall Creators Update”的发布,UWP模型发生了变化,它使得直接通过网站安装UWP应用程序成为可能。虽然和ClickOne的体验不完全一样,但至少是个开始。同时,微软有一个团队致力于使XAML/UWP更适用于LOB应用程序。

Windows UI库

用户控件是任何UI框架的核心。强大的用户控件模型促成了Visual Basic在20世纪90年代的流行,并且仍然使桌面应用程序的开发速度高于基于HTML的解决方案。但是,UWP部署模型给它带来了一些不必要的限制。

由于主要的用户控件(又名平台控件)已经变成了OS的一部分,所以,应用程序在采用新控件时必须非常保守。有些公司的机器虽然运行着Windows 10,但其版本经常比正式发布的版本落后两个版本,这时候问题会尤为突出。

为了解决这个问题,平台控件现在作为NuGet包发布。这使得开发人员可以利用新控件,而不必等待公司的其他部门都升级到最新的Windows版本。这些NuGet包至少需要2016年8月发布的Windows周年纪念版。

这些控件填补了UWP生态系统中众所周知的空白,如缺少tree-view、菜单栏或颜色选择板。

.NET Standard

借助.NET Framework和.NET Core,UWP现在支持.NET Standard 2.0。这使得开发人员可以把他们的业务逻辑和数据模型迁移到.NET Standard库。那样,他们就可以在传统的桌面应用程序、网站或UWP应用之间共享同样的代码。理论上讲,这将简化从WinForms/WPF到UWP的迁移。

UI密度

微软把UWP中的默认空间和大小描述为“慷慨提供了大量空白”。计划在今年发布的Windows版本将改变这种默认情况,通过自动减少控件尺寸、控件之间的填充空间、字体大小,释放更多屏幕实际使用面积,一般来说,就是让一切更紧凑。按照他们的估计,你可以把屏幕上的控件数量增加约三分之一。

开发人员可以通过选择简洁模式进一步缩小控件的尺寸。控件之间的空间减少了大约40%,一次可以看到的数据增加了大约50%。这项特性主要是针对数据密集型的业务线应用程序。

颜色主题

众所周知,一个令人愉快的颜色主题会增加用户对工具的信任。但是,对于像UWP/XAML这样复杂的样式模式,通常甚至没有时间应用最基本的颜色。基本上,问题在于,每种控件类型的样式都需要单独更新,然后再测试整个主题。在构建业务线应用程序时,很少有足够的时间这样做。

有一款新工具,姑且称之为“Color Demo”,就是要解决这个问题。使用简单的颜色选择器,就可以预览主题,生成必要的资源字典,包含到应用程序中。

而且,它会提示你颜色选择可能导致的问题,如没有足够的对比度使文本可读。

这还不如全样式的XAML应用程序丰富,但是,它可以为应用程序提供足够的修饰,使它看上去有一个专业的外观。

数据验证UI

UWP还有另外一个明显的不足,就是缺少数据验证支持。这个疏忽很奇怪,因为数据验证从一开始就是.NET UI框架的一部分。(我们在文章“C# API中的模型和它们的接口设计”中讨论过其中部分接口)。

今年新增的功能是在基于属性的验证中使用INotifyDataErrorInfo接口。当一个模型暴露了这个接口,UI就能够自动显示正确的错误信息。它显示错误的具体方式取决于你在控件中选择了哪个模式。

实现INotifyDataErrorInfo接口并不简单,涉及许多把基于属性的验证附加到INotifyDataErrorInfo接口的样板代码。因此,你也许会希望找一个MVVM框架来帮你处理。[本文作者的Tortuga Anchor库就是这样一个例子。]

新XAML控件:Data Grid

对于非UWP开发人员,没有提供开箱即用的Data Grid看上去相当奇怪。

对于业务线开发人员,UI框架不提供Data Grid几乎是不可想象的。甚至是早在上世纪90年代中期,这个控件的一个变体就已经成为无数业务应用程序的核心。许多在考虑UWP的开发人员惊讶地发现,微软已经从WPF或Silverlight移植了Data Grid。

这最终是通过Windows Community Toolkit解决的。新的DataGrid控件所需要的XAML看上去和在WPF中非常像。

下周,我们将深入介绍Windows Community Toolkit。

原文地址:http://www.infoq.com/cn/news/2018/08/UWP-LOB-Win10


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg

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

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

相关文章

牛客网【每日一题】 合集

文章目录2020年3月25日 NC50439 tokitsukaze and Soldier 牛客练习赛50-C2020年3月26日 NC13230 合并回文子串 美团2017年CodeM大赛-初赛A轮2020年3月27日 NC15553 数学考试 2018年长沙理工大学程序设计竞赛2020年3月30日 NC50528 滑动窗口 《信息学奥赛一本通》Part5.52020年3…

NBA总冠军

NBA总冠军NBA总冠军NBA总冠军 题目描述 又要考试了,LJW决定放松一下,就打开电视,看见篮球赛,他立即想到了每年的NBA总冠军队伍。由于复习紧张,他只记起了一部分,记忆的内容是正确的,可能不是按…

P6773-[NOI2020]命运【线段树合并,树形dp】

正题 题目链接:https://www.luogu.com.cn/problem/P6773 题目大意 nnn个点的一棵树,边权可以是000或111。mmm个条件(x,y)(x,y)(x,y)表示要求x,yx,yx,y之间要有边权值为111(保证xxx是yyy的祖先),求方案数。 解题思路 考虑容斥&am…

读 《CSharp Coding Guidelines》有感

C# 编程指南前不久在 Github 上看见了一位大牛创建一个仓库:CSharpCodingGuidelines,打开之后看了一下 readme.md 相关描述,感觉应该很不错,于是就 clone 到本地拜读一下,这里列一些自己的笔记,方便日后回顾…

牛客网 【每日一题】4月10日 二分图染色(弱化版)

精讲 组合、容斥 文章目录题目:题意&&题解::代码:题目传送题目: 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 524288K,其他语言1048576K 64bit IO Format: %lld …

数字游戏(水博客ing / csp-J T1 / luogu 5660)

数字游戏 luogu 5660 题目大意: 给你一个长度为8的01串,分别表示你某一场比赛是否AKAKAK了,问你AKAKAK了几场比赛 输入样例#1 00010100输出样例#1 2输入样例#2 11111111输出样例#2 8样例解释#1 该 01 字符串中有 2 个字符 1。 样例…

P2231-[HNOI2002]跳蚤【容斥】

正题 题目链接:https://www.luogu.com.cn/problem/P2231 题目大意 求一个由[1,m][1,m][1,m]的整数组成的长度为nnn的序列使得他们的gcdgcdgcd和mmm互质。 解题思路 考虑容斥减去不合法的答案。那就是要求序列的gcdgcdgcd和mmm不互质的个数,那么我们依旧需要容斥计…

微软Windows Community Toolkit一览

为了满足业务线开发人员的需求,微软推出了Windows Community Toolkit。这个快速变化的库充当了新的UWP控件和功能的测试基础。在创建UWP之初,其重点目标是智能手机和平板电脑。这意味着大部分开发预算都花费在控件上,确保这些控件能够在有限的…

牛客网【每日一题】4月14日题目精讲 Xorto

文章目录题目描述题解:代码:扩展传送时间限制:C/C 2秒,其他语言4秒 空间限制:C/C 32768K,其他语言65536K 64bit IO Format:%lld 题目描述 给定一个长度为n的整数数组,问有多少对互不重叠的非空区…

YbtOJ#20081-[NOIP2020模拟赛B组Day8]树上排列【组合数,树形dp】

正题 题面链接:https://www.ybtoj.com.cn/contest/62/problem/3 题目大意 nnn个点的一棵树&#xff0c;每个边的边会表示一个大小关系&#xff08;如px>pyp_x>p_ypx​>py​或px<pyp_x<p_ypx​<py​&#xff09;。求有多少个排列满足所有条件。 解题思路 考…

如何简单的在 ASP.NET Core 中集成 JWT 认证?

前情提要&#xff1a;ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统文章超长预警&#xff08;1万字以上&#xff09;&#xff0c;不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包自上一篇介绍如何在 ASP.NET Core 中集成 JWT 的博文发布…

【二分】【暴力】蛋糕(gmoj 3918)

蛋糕 gmoj 3918 题目大意&#xff1a; 有一个蛋糕&#xff0c;分成n∗mn*mn∗m个单位&#xff0c;现在横竖各切三刀&#xff0c;使其分成16个矩阵&#xff0c;使价值最小的矩阵价值最大 输出样例 5 5 95998 21945 23451 99798 74083输入样例 3数据范围 40%的数据&#x…

Music Problem

文章目录题目描述题意&#xff1a;题解&#xff1a;传送时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld 题目描述 Listening to the music is relax, but for obsessive(强迫症), it …

【DP】翻硬币(jzoj 3921)

翻硬币 jzoj 3921 题目大意&#xff1a; 给你一个长度为nnn的当前01串和目标01串&#xff0c;现在你要做mmm此操作&#xff0c;每次操作你要使kkk个不同的位取反&#xff0c;现在问你有多少种方法可以使当前01串变为目标01串 输入样例&#xff1a; 3 2 1 100 001输出样例&…

可扩展架构设计的三个维度

业界对于可扩展的系统架构设计有一个朴素的理念,就是&#xff1a;通过加机器就可以解决容量和可用性问题这一理念在“云计算”概念疯狂流行的今天&#xff0c;得到了广泛的认可&#xff01;对于一个规模迅速增长的系统而言&#xff0c;容量和性能问题当然是首当其冲的。但是随着…

YbtOJ#20082-[NOIP2020模拟赛B组Day8]导出子图【dp】

正题 题面链接:https://www.ybtoj.com.cn/contest/62/problem/4 题目大意 nnn个区间&#xff0c;如果第xxx个区间和第yyy个区间有交集那么xxx到yyy直接就有一条边。 求这张图上的所有导出子图中有多少棵树。 解题思路 条件可以转换为这些区间联通并且没有一个位置被333个区间…

.NET Core开发日志——简述路由

有过ASP.NET或其它现代Web框架开发经历的开发者对路由这一名字应该不陌生。如果要用一句话解释什么是路由&#xff0c;可以这样形容&#xff1a;通过对URL的解析&#xff0c;指定相应的处理程序。回忆下在Web Forms应用程序中使用路由的方式&#xff1a;然后是MVC应用程序&…

【单调栈】奶牛的歌声(jzoj 1256)

奶牛的歌声 jzoj 1256 题目大意 有n头牛&#xff0c;每头牛的声音可以被两边第一头比他高的牛所听到&#xff0c;音量为S&#xff0c;问听到声音的音量之和最大的牛听到的音量之和是多少 输入样例 3 4 2 3 5 6 10输出样例 7样例解释 队伍中有3头奶牛&#xff0c;第1头牛…

P3168-[CQOI2015]任务查询系统【主席树】

正题 题目链接:https://www.luogu.com.cn/problem/P3168 题目大意 nnn个任务(si,ei,ti)(s_i,e_i,t_i)(si​,ei​,ti​)表示从si∼eis_i\sim e_isi​∼ei​的任务优先级为tit_iti​。 然后每次询问一个时刻前kkk小的优先级任务优先级和。 解题思路 开主席树&#xff0c;在sis…

相反数

A 相反数 传送 题意&#xff1a; 一个数加上他的相反数 题解&#xff1a; 用字符串存数&#xff0c;分出求出本身和相反数的值&#xff0c;然后相加输出&#xff0c;注意判断相反后出现0的情况 代码 #include<bits/stdc.h> using namespace std; int main() {str…