在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情。最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,000 Things You Should Know About WPF 。听到博客名字就懂这个人有多伟大了吧。他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识。Follow他的博客也有一段日子了,很希望能够分享给大家。
本系列我不仅会翻译他的每一个tip,也会加入自己开发之中的看法和见解,希望能够以更贴近的语言来展示大师的风采。本系列我希望自己也能和他一样坚持下来,每天的进步才能促成伟大。
如果大家更想了解这个伟大的程序员,这个是访谈链接,他在访谈中有谈到自己生平和对编程相关学习的看法,我觉得对大家会帮助很大,有时间后面会出一篇翻译这个访谈的文章供大家阅读,希望大家能够关注。
[小九的学堂,致力于以平凡的语言描述不平凡的技术。如要转载,请注明来源:小九的学堂。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 >> 16); 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,敬请期待。