UWP?UWP! - Build 2015有些啥?

Build 2015圆满落幕了,不知大家有多少人刷夜看了直播呢?不管怎么说,想必各位都很好奇在这场微软开发者盛宴上,Microsoft又发布了什么令人惊叹的消息吧。笔者略微整理了一些与UWP相关的内容,抛砖引玉,并不全面,希望读者多多指正。

(文章中涉及的图片均来源于Build)

4. UWP开发框架的新特性

作为全新的应用类型,UWP自然有了全新的开发框架。用C#+XAML来说,基本保持了UAP的开发模式,但是新增了诸多特性。在这里简单为大家列举一二。

新加入的通用控件

在UWP中,由于没有平台区别,几乎所有控件都成为跨平台控件了,而非UAP下不同平台的使用限制。其中值得注意的一些新控件有:

  • Pivot:是的,就是大家耳熟能详的Pivot,现在可以在所有平台使用了。区别在于在大屏环境下其行为、展现方式会有略微不同。

  • AutoSuggestBox:有自动补齐功能的搜索框,将替代传统的SearchBox。
  • UniversalMaps:跨平台的地图控件,再也不用为不同平台的定位应用设计不同的地图展示逻辑了。
  • SplitView: 提供可伸缩的导航栏用于导航容器中的页面,作为一个全新的控件,其具有极高的页面适配性,利用下文介绍的自适配技术可以轻松地让其适配复杂的页面。
  • InkCanvas:新封装的控件以支持用户笔记,其应用场景还是很多的,可以省去在这些情况下开发者的不少精力了,毕竟实现一个用户友好的图画版并不轻松。

自适配辅助

由于UWP将面对复杂多变的应用分辨率,曾经为一些固定分辨率设计页面的日子一去不复返。从这点来说,UWP也更靠近网页设计一些。可是对于html,我们有relative、有流式布局;XAML呢,总不能老是把自适配实现在csharp代码里吧?别急,XAML足够做绝大部分的工作。且看:

VisualStateManager

这是XAML的一个元素,其功能,一言以蔽之,就是管理在不同条件下页面各元素的属性以及其切换时过渡方式。我们先看下面的一段代码:

  1. <VisualStateGroup x:Name="WindowSizeStates">
  2. <VisualState x:Name="WideState">
  3. <VisualState.Setters>
  4. <Setter Target="splitView.DisplayMode" Value="Inline" />
  5. </VisualState.Setters>
  6. <VisualState.StateTriggers>
  7. <AdaptiveTrigger MinWindowWidth="720" />
  8. </VisualState.StateTriggers>
  9. </VisualState>
  10. <VisualState x:Name="NarrowState">
  11. <VisualState.Setters>
  12. <Setter Target="splitView.DisplayMode" Value="Overlay" />
  13. </VisualState.Setters>
  14. <VisualState.StateTriggers>
  15. <AdaptiveTrigger MinWindowWidth="0" />
  16. </VisualState.StateTriggers>
  17. </VisualState>
  18. </VisualStateGroup>

上述代码的作用是当页面宽度大于720时,将splitView.DisplayMode属性调节为inline;否则为Overlay。其语法和规则都相当简单,只需在不同的VisualState中定义对应的Trigger和Setter即可,如果有需要还可以定义不同State间的切换动画。

其中值得注意的是,Trigger并非只能使用框架给出的指定触发器这么简单,它是可以自定义的,再看下面这个例子:

  1. public class InputTypeTrigger : StateTriggerBase
  2. {
  3. private FrameworkElement _targetElement;
  4. private PointerDeviceType _lastPointerType, _triggerPointerType;
  5.  
  6. public FrameworkElement TargetElement
  7. {
  8. get { return _targetElement; }
  9. set
  10. {
  11. _targetElement = value;
  12. _targetElement.AddHandler(FrameworkElement.PointerPressedEvent, new PointerEventHandler(_targetElement_PointerPressed), true);
  13. }
  14. }
  15. public PointerDeviceType PointerType
  16. {
  17. get { return _triggerPointerType; }
  18. set { _triggerPointerType = value; }
  19. }
  20.  
  21. private void _targetElement_PointerPressed(object sender, PointerRoutedEventArgs e)
  22. {
  23. _lastPointerType = e.Pointer.PointerDeviceType;
  24. SetActive(_triggerPointerType == _lastPointerType);
  25. }
  26. }

其自定义了Trigger,用于判断某个元素的按下类型是鼠标/手指,并在满足条件时触发。我们再看看它在XAML里的用法:

  1. <VisualStateGroup x:Name="InputTypeStates">
  2. <VisualState>
  3. <VisualState.StateTriggers>
  4. <triggers:InputTypeTrigger TargetElement="{x:Bind ActivityList}" PointerType="Touch" />
  5. <triggers:InputTypeTrigger TargetElement="{x:Bind ActivityList}" PointerType="Pen" />
  6. </VisualState.StateTriggers>
  7. <VisualState.Setters>
  8. <Setter Target="GoToTopButton.Visibility" Value="Visible" />
  9. </VisualState.Setters>
  10. </VisualState>
  11. </VisualStateGroup>

如果使用熟练,其能发挥的作用异常强大。

RelativePanel

可能有读者会疑惑了:即使有很强大、可自定义的Trigger,我能做的也不就只有定制一些属性么?如果我想根据具体情况调节位置、尺寸,该怎么办,还是只能诉诸代码么?当然不是:RelativePanel将提供你想要的:
有想过html的流式布局么,有考虑过float一类的css属性在xaml中实现么?RelativePanel正是支持他们的容器。请看下面一段代码:(省略该控件所特化的属性)

  1. <RelativePanel>
  2. <Image x:Name="img"/>
  3. <TextBlock x:Name="title" RelativePanel.RightOf="img" RelativePanel.AlignTopWith="img"/>
  4. <TextBlock x:Name="authors" RelativePanel.RightOf="img" RelativePanel.Below="title"/>
  5. <TextBlock x:Name="summary" RelativePanel.RightOf="img" RelativePanel.Below="authors"/>
  6. <Button Content="Download" RelativePanel.RightOf="img" RelativePanel.AlignBottomWithPanel="True"/>
  7. </RelativePanel>

其实际展示效果如下:

看到了其中类似于Rightof/below的属性了吗?这种相对布局方式正式RelativePanel的精髓所在,利用它可以实现零代码达到页面适配,而精通流式布局的网页设计者们更完全可以仅仅利用其就使自己的页面达到网页的适配程度。当然,配合VisualState的属性设置,它们能带来极灵活的页面行为,足够满足大部分页面布局需求,只有少部分相当定制化的页面行为需要书写代码了。

已经进行过设备适配的控件们

对于大家日常使用的控件,在不同设备上运行时也有不同的效果,它们是微软专门设计以适配不同操控类型、屏幕大小设备,从这一点来说,可以省去页面设计者不小功夫。如:

  • MenuFlyout控件在鼠标激发和手指激发时的菜单间距并不相同,以给两种操控方式提供最好的用户体验。
  • Pivot在不同尺寸屏幕下的选定标签位置有所区别,以方便单手/双手触控。

全新的绑定方式:编译时绑定

新的XAML提供了一种不一样的绑定方式:编译时绑定({x:bind})。其绑定关系将会在编译时得到检查,运行时仅存在他们之间的数据依赖。正因如此,这种绑定在运行时的效率得到了极大的提升。从Build展示的数据来看,其绑定效率、属性修改响应效率以及资源节省度都有了数倍提升。

  1. <DataTemplate x:DataType="model:FileItem">
  2.   <Grid Width="200" Height="80">
  3.     <TextBlock Text="{x:Bind DisplayName}" />
  4.     <TextBlock Text="{x:Bind prettyDate}" />
  5.   </Grid>
  6. </DataTemplate>

尽管编译时绑定有不能再运行时动态修改、不能绑定style等缺点,但其效率表明这将是数据绑定模式在未来的发展方向。各位拭目以待吧~

界面响应速度全面提升

既然要做UWP了,如果效率本身不够过硬,怎么适应各种多变的部署平台?微软在这方面也是煞费苦心,大幅提升其运行效率和稳定度,以求用UWP替代传统的pe文件作为微软产品主力军。可以在Build展示里窥见UWP风格的Office,可见未来的Office甚至VS都可能是UWP的囊中之物。那么究竟有什么改动呢?

  • XAML元素的惰性加载特性:想必大家都听说过一些函数式编程语言中惰性求值的概念,这里这种概念移植到了界面渲染上。惰性载入可以保证更快的程序启动时间和用户在一般情况下操作的响应速度。
  • 文字渲染效率提升:UWP渲染文字的效率提升了50%
  • 绑定加速:上文已经讲过,此处并不赘述。
  • 新增加的Visual Layer访问API将允许开发者碰触一些更底层的渲染机制,从而在实现动画、变换等操作时拥有更高的效率。

5. 能不能更给力一点?

想获得更多有关Build的展示情况,请访问
http://channel9.msdn.com/events/build/2015?Media=true&wt.mc_id=build_hp
查看更多展示的视频和ppt吧。

UWP?UWP! - Build 2015有些啥?(2)的更多相关文章

  1. UWP?UWP! - Build 2015有些啥?(1)

    UWP?UWP! - Build 2015有些啥? Build 2015圆满落幕了,不知大家有多少人刷夜看了直播呢?不管怎么说,想必各位都很好奇在这场微软开发者盛宴上,Microsoft又发布了什么令 ...

  2. Microsoft Build 2015 汇总

    简要概括(GitHub 完成约 45%): Visual Studio Code Preview(意料之外) Visual Studio 2015 RC Visual Studio 2013 Upda ...

  3. Build 2015 Beijing & Windows 10 China Geek Challenge

    6月5日,借着Build 2015在北京召开分会的东风,参加了这次由微软中国举办的Windows 10中国开发者极客挑战赛. 白天是Build 2015课程,学习了Windows 10最新的技术,包括 ...

  4. BUILD 2015: Visual Studio对GitHub的支持

    微软BUILD 2015大会上发布了Visual Studio 对GitHub的支持.安装了如下Developer Assistant插件后,你便可以在Visual Studio中找到GitHub上的 ...

  5. Microsoft Build 2015

    Microsoft Build 2015 汇总   简要概括(GitHub 完成约 45%): Visual Studio Code Preview Visual Studio 2015 RC Vis ...

  6. [UWP]UWP App Data存储和获取

    这篇博客介绍如何在UWP开发时,如何存储App Data和获取. App Data是指用户的一些设定,偏好等.例如,App的主题,是否接收推送,离线接收消息等.需要区分下App Data和User D ...

  7. [UWP]UWP中获取联系人/邮件发送/SMS消息发送操作

    这篇博客将介绍如何在UWP程序中获取联系人/邮件发送/SMS发送的基础操作. 1. 获取联系人 UWP中联系人获取需要引入Windows.ApplicationModel.Contacts名称空间. ...

  8. 挑灯熬夜看《Build 2015 Keynote》图文笔记

    又是一年微软Build大会时间,网络上流传各种微软新品发布的消息终于也要揭晓了,一直熬夜到凌晨3点,好久没有这么兴奋了. 微软给力的很嘛! Satya nadella开始讲解 首先回顾微软的传统和技术 ...

  9. 微软build 2015

    1.apple Object-C项目和安卓项目经过移植可以运行在windows上,演示看起来有些卡. 2.平台大统一,Universal Windows App,10亿台设备,这个很重要,以后恐怕离不 ...

随机推荐

  1. 快速排序 - C语言

    看了这本<数据结构与算法分析>中的快速排序. 写下自己理解后的代码,以备后用. #include "stdio.h" void insertSort(int arr[] ...

  2. PHP高并发高负载系统架构

    PHP高并发高负载系统架构 1.为什么要进行高并发和高负载的研究 1.1.产品发展的需要 1.2.公司发展的需要 1.3.当前形式决定的 2.高并发和高负载的约束条件 2.1.硬件 2.2.部署 2. ...

  3. [python] os.path说明

    os.path - Common pathname manipulations操作 This module implements some useful functions on pathnames. ...

  4. C#方法中三个重要的参数:out、ref、params

    备注:适用于初学者,自学于传智播客. 1.out参数. 概念:如果在一个方法中,返回多个相同类型值的时候,可以考虑返回一数组.但是返回多个不同类型值的时候,返回数组显然不能解决问题,这时就引入out参 ...

  5. myeclipse项目编码方式彻底设置

    我们团队6月10号开始做龙泉瓯江青瓷有限公司的ERP系统,采用java语言开发,在开发时我们采用的是java的流行框架struts2,前端脚本都用jquery框架,开发IDE用的是myeclipse, ...

  6. 关于CSS中text-decoration值没有替换而是累积的疑问

    做了个实验: <!DOCTYPE html> <html> <head> <title>BaiDuTest.html</title> < ...

  7. 本地socket使用AF_UNIX

    int socket(int domain, int type, int protocol); domain参数代表地址族,我们最常用的是TCP/IP协议通信中使用的是AF_INET,在有些情况下建立 ...

  8. CodeForces 743A Vladik and flights (水题)

    题意:sb要从a到b,然后要乘坐飞机,只有两家有飞机,如果乘坐同一家的,就免费,如果不是就收到abs(j-i) 的费用,问你最少花费是多少. 析:直接考虑a和b是不是同一家的,如果是,花费为0,如果不 ...

  9. Head First 设计模式读书笔记

    在网上学习了一段时间设计模式,总感觉不系统,很容易忘,最近买书,学习了<Head First设计模式>,受益匪浅,特做此记录,以便激励自己不断的向后学习. 原书JAVA版本,本次学习记录及 ...

  10. M1M2总结

    这个学期很开心可以和一帮兄弟姐妹们一起做软件写代码,总体看下来真的是充满哦了艰辛和困苦.虽然我是负责软件测试的这一块的,但是看着他们辛苦的写代码我也很是为他们着急和心疼.毕竟,编译当头,数据库辅助,每 ...