在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情。最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,000 Things You Should Know About WPF 。听到博客名字就懂这个人有多伟大了吧。他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识。Follow他的博客也有一段日子了,很希望能够分享给大家。

  本系列我不仅会翻译他的每一个tip,也会加入自己开发之中的看法和见解,希望能够以更贴近的语言来展示大师的风采。本系列我希望自己也能和他一样坚持下来,每天的进步才能促成伟大。

  如果大家更想了解这个伟大的程序员,这个是访谈链接,他在访谈中有谈到自己生平和对编程相关学习的看法,我觉得对大家会帮助很大,有时间后面会出一篇翻译这个访谈的文章供大家阅读,希望大家能够关注。

  在这里郑重说明.该系列是基于Sean Sexton先生的英文博客, Sean Sexton拥有全部版权和撤销权利。

  [小九的学堂,致力于以平凡的语言描述不平凡的技术。如要转载,请注明来源:小九的学堂cnblogs.com/xfuture]


  #1. 什么是WPF

  WPF(Windows Presentation Foundation)是从.Net Framework从3.0开始加入的提供了全新的多媒体交互用户图形界面的类库,真正做了开发和设计分离的工作。WPF程序可以在桌面运行,也可以在WEB浏览器上运行(Silverlight).

  WPF使用3D矢量图形元素来进行图形渲染,独立于屏幕分辨率。使用DirectX硬件加速来渲染图形元素。带来了更绚丽的色彩和炫酷的效果。.Net 3.0后WPF逐步代替Windows Form成为了新一代的Windows客户端技术。

  #2. 图形渲染级别(Rendering Tiers)

  WPF应用程序会自动检查显卡运行能力并分配给一个渲染能力值。指示哪些功能可以通过图形层次完成。

  级别Tier 0 - 没有硬件加速,所有用软件绘制。

  级别Tier 1 - 一部分使用硬件加速,需要DirectX版本高于9.0. 硬件加速部分:径向渐变(Radial gradients), 3D亮点图形计算(3D lighting calculations), 文字渲染(Text rendering), 3D抗锯齿(3D anti-aliasing).

  级别Tier 2 - 大部分使用硬件加速。Directx版本高于9.0

  获得当前渲染级别方法:

int renTier = (RenderCapability.Tier >> );
MessageBox.Show(string.Format("Tier = {0}", renTier));

 

  #3. 矢量图形,与分辨率无关

  在WPF中,图形渲染使用的是矢量,而不是位图。无论是默认控件还是自定义样式图像都是与分辨率无关。

  WPF代替了位图在屏幕上渲染图形每个像素的方法,矢量绘制了一些基础的单元:如形状,线,多边形等。

  因为WPF使用了矢量图形绘制,所以用户界面元素独立于实际设备的分辨率来渲染。WPF绘制的图像尺寸使用了与设备无关的单位,每一个单位是1/96英寸。这意味着用户界面的元素总是会呈现指定大小,不会被分辨率(DPI)影响。

  

  #4. WPF布局(Layout)

  WPF使用了流式布局模型来进行定位元素,而不是使用精确的像素坐标来确定控件的位置。使用了描述性语言XAML来进行定位,类似HTML和CSS网页布局,极为简捷方便。

  流式布局模型可以使WPF布局可以进行动态调整以适合窗口,呈现流动状态。WPF界面的大小和分辨率并无关系。

  所有的WPF控件都是被承载在一个容器(Container)里,主流的容器有:Grid, DockPanel, StackPanel, WrapPanel.

  

  

  #5. 样式(Style)

  样式是类似CSS功能的一组可以重用的设置类似性质控件的属性值。你可以将之存储为资源(Resource), 然后应用在多个控件上。举个样例,你应用中所有的button都是一个风格,你需要先定义一个样式作为静态资源(StaticResource)

<Window.Resources>
<Style x:Key="StdButton" TargetType="Button">
<Setter Property="Width" Value="100"/>
<Setter Property="Control.Background" Value="AliceBlue"/>
<Setter Property="Control.FontFamily" Value="Calibri" />
<Setter Property="Control.FontWeight" Value="Bold" />
</Style>
</Window.Resources>

  然后你就可以应用到你需要样式的button上:

<Button Content="I'm Tiny Nine" Style="{StaticResource StdButton}" />
<Button Content="Follow Me" Style="{StaticResource StdButton}" />
<Button Content="Not Follow me"/>

  

  #6. 模板(Template)

  模板类似与样式(Style), 但实际并不相同。模板可以更换一个UI控件的外观,但不能改变其行为。一般Template都定义在Style之中。WPF每一个控件都有其默认的模板,你可以撰写一个模板来代替其默认模板来进行私人定制。

  通过改变模板的属性来改变其模板。下面是一个例子,我们创建了一个新的button,它具有了加厚的蓝色边框。

  

<Window.Resources>
<ControlTemplate x:Key="Crazy" TargetType="Button">
<Border BorderBrush="Blue" Background="White" BorderThickness="3">
<ContentPresenter></ContentPresenter>
</Border>
</ControlTemplate>
</Window.Resources>
<Grid Height="auto" Width="503">
<StackPanel Height="100" HorizontalAlignment="Left" Margin="85,139,0,0" Name="stackPanel1" >
<Button Content="Crazy template" Template="{StaticResource Crazy}" />
<Button Content="Default template" />
</StackPanel>
</Grid>

  

  #7. 命令(Commands)

  WPF提供对命令(Commands)的支持,Command在WPF中是事件的进化体。WPF可以将Command绑定到空间上,来减少重复的事件代码。多个控件可以使用同一个Command逻辑。Command可以使UI和逻辑分离,实现了UI操作,后台执行命令逻辑。WPF程序内置了很多命令,如Paste, Copy, Save等。

  下面代码展示了控件绑定命令的两种方式:

  

<Button Content="New" Command="ApplicationCommands.New"/>

// Create binding--which binds the command to your code
CommandBinding binding = new CommandBinding(ApplicationCommands.New);
binding.Executed += new ExecutedRoutedEventHandler(CommandNew_Executed);
this.CommandBindings.Add(binding);

  2014-05-22 会更新后续8-14,敬请期待。

2000条你应知的WPF小姿势 基础篇<1-7>的更多相关文章

  1. 2000条你应知的WPF小姿势 基础篇<15-21>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...

  2. 2000条你应知的WPF小姿势 基础篇<78-81 Dialog/Location/WPF设备无关性>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  3. 2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  4. 2000条你应知的WPF小姿势 基础篇<69-73 WPF Freeze机制和Template>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  5. 2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  6. 2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  7. 2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>

    前一阵子由于个人生活原因,具体见上一篇,耽搁了一阵子,在这里也十分感谢大家支持和鼓励.现在开始继续做WPF2000系列. 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件 ...

  8. 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  9. 2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  10. 2000条你应知的WPF小姿势 基础篇<34-39 Unhandled Exceptions和Resource>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

随机推荐

  1. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  2. python之路 - 基础1

    1.安装windows安装双版本Python2,Python3 下载Python2和Python3https://www.python.org/downloads/ 分别安装两个版本 进入Python ...

  3. json与JavaScript对象互换

    1,json字符串转化为JavaScript对象: 方法:JSON.parse(string) eg:var account = '{"name":"jaytan&quo ...

  4. 【WCF】错误协定声明

    在上一篇烂文中,老周给大伙伴们介绍了 IErrorHandler 接口的使用,今天,老周补充一个错误处理的知识点——错误协定. 错误协定与IErrorHandler接口不同,大伙伴们应该记得,上回我们 ...

  5. beans.xml

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  6. 【Linux大系】Linux的概念与体系

    感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 我在这一系列文章中阐述Linux的基 本概念.Linux操作系统继承自UNIX.一个操作系统是一套控制和使用计算 ...

  7. sql 删除表中的重复记录

    嗯,遇见了表中存在重复的记录的问题,直接写sql删除时最快的,才不要慢慢的复制到excel表中慢慢的人工找呢.哼. 如下sql,找出重复的记录,和重复记录中ID值最小的记录(表中ID为自增长) sel ...

  8. mac下生成ssh keys 并上传github仓储

    使用github仓储需要本机生成一个公钥key 添加到自己的git账户SSH keys中   mac 生成方法:   1. 打开终端 输入   ssh-keygen 然后系统提示输入文件保存位置等信息 ...

  9. 关于Java中进程和线程的详解

    一.进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命 周期.它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而 ...

  10. 一步步学习javascript基础篇(8):细说事件

    终于学到事件了,不知道为何听到“事件”就有一种莫名的兴奋.可能是之前的那些知识点过于枯燥无味吧,说起事件感觉顿时高大上了.今天我们就来好好分析下这个高大上的东西. 可以说,如果没有事件我们的页面就只能 ...