2000条你应知的WPF小姿势 基础篇<1-7>
在正文开始之前需要介绍一个人: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>的更多相关文章
- 2000条你应知的WPF小姿势 基础篇<15-21>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...
- 2000条你应知的WPF小姿势 基础篇<78-81 Dialog/Location/WPF设备无关性>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- 2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- 2000条你应知的WPF小姿势 基础篇<69-73 WPF Freeze机制和Template>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- 2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- 2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- 2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>
前一阵子由于个人生活原因,具体见上一篇,耽搁了一阵子,在这里也十分感谢大家支持和鼓励.现在开始继续做WPF2000系列. 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件 ...
- 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- 2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- 2000条你应知的WPF小姿势 基础篇<34-39 Unhandled Exceptions和Resource>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
随机推荐
- Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记
以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆.感觉麻烦死了.今天学习了SwipeRefreshLayout 的用法,来分享一下,有 ...
- NPM (node package manager) 入门 - 基础使用
什么是npm ? npm 是 nodejs 的包管理和分发工具.它可以让 javascript 开发者能够更加轻松的共享代码和共用代码片段,并且通过 npm 管理你分享的代码也很方便快捷和简单. 截至 ...
- wepack+sass+vue 入门教程(三)
十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...
- 【原】实时渲染中常用的几种Rendering Path
[原]实时渲染中常用的几种Rendering Path 本文转载请注明出处 —— polobymulberry-博客园 本文为我的图形学大作业的论文部分,介绍了一些Rendering Path,比较简 ...
- AFNetworking 3.0 源码解读(七)之 AFAutoPurgingImageCache
这篇我们就要介绍AFAutoPurgingImageCache这个类了.这个类给了我们临时管理图片内存的能力. 前言 假如说我们要写一个通用的网络框架,除了必备的请求数据的方法外,必须提供一个下载器来 ...
- slf4j中的MDC
slf4j中MDC是什么鬼 slf4j除了trace.debug.info.warn.error这几个日志接口外,还可以配合MDC将数据写入日志.换句话说MDC也是用来记录日志的,但它的使用方式与使用 ...
- 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦
1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...
- 微信小程序体验(1):携程酒店机票火车票
在 12 月 28 日微信公开课上,张小龙对微信小程序的形态进行了阐释,小程序有四个特定:无需安装.触手可及.用完即走.无需卸载. 由于携程这种订酒店.火车票和机票等工具性质非常强的服务,非常符合张小 ...
- Oracle使用触发器和mysql中使用触发器的比较——学习笔记
一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志, ...
- 最近在玩linux时 yum 遇到了问题
主要是软件源出现了问题 我做的方式可能比较粗暴 ls -l /etc/yum.repos.d/ /*查看软件源*/ rm -rf /etc/yum.repos.d/ /*全删了*/ m ...