迟到的 WPF 学习 —— 入门
之所以说“迟到的”,是因为我太晚才开始学习 WPF 了,之前 WPF 刚发布的时候有过粗浅了解,那时的 WPF 还非常简陋,VS 提供的内置控件十分匮乏,让我这样的非常依赖 WinForm 形式“控件”程序爱好者很是难受,既垂涎于 WPF 提供的创新的表现技术,又因为没有“足够”的现成的控件来使用而暂时放弃,因为不是专业 Coder 所以并不急于学习,直到现在。
跟随的学习教材是群里同学提供的《WPF编程宝典.C#2010版》,不多说废话,点滴记录学习所获吧。
1. WPF 使用的是 DirectX 作为引擎,所以理论上和实际表现上都远超过使用 GDI+ 的原 WinForm 模式,即便是 2D 平面绘制也是将信息转化为三角形交由 Direct3D 渲染。结论:WPF 的底层处理已经完全不同于原先的 Windows 下程序,DirectX 是关键鞋底。
2. WPF 有一个特性很好,就是“设备无关”性的坐标理解。因为其不同于原来“像素”性的画法,WPF 可以自动处理不同分辨率设备产生的缩放给应用程序带来的影响。结论:WPF 真正完成了比例性显示,而不是原来 WinForm 下程序因为分辨率的更改带来窗体的面目全非。
3. XAML(咋没了)是描述 WPF 程序界面最合适的方法,但 XAML 属于 WPF 的一部分,WPF 也并非必需 XAML 才能运行,这一点要理解,不理解要记住,记不住要知道,不知道就打。
4. XAML 中所有元素都映射为一个 .Net 实例,比如<Button>就表示一个 WPF 要创建一个 Button 对象,这一点可以简单理解为,XAML 语言中没有废话,挺好。
5. 因为属于 XML 语言范畴,XAML 中的对象支持嵌套,比如 <Grid><Button></Button></Grid>,这表示 Gird 里边有一个 Button。这种嵌套表示对象之间的层级关系,也可以表示属性。
<Grid>
<Grid HorizontalAlignment="Left" Height="165" Margin="10,10,0,0" VerticalAlignment="Top" Width="497"/>
<Grid.Background>
<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.00" Color="Green"></GradientStop>
<GradientStop Offset="0.70" Color="IndianRed"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Grid.Background>
</Grid>
6. 以上面代码为例,简单描绘一个“元素”(WPF 中每一个显示对象都称为元素而非控件,控件一般指可交互的元素)的属性可以用 <Grid HorizontalAlignment="Left"> 这种属性-特性方式,如果要设置复杂属性,可以使用嵌套方式,像上面代码中 <Gird.Background>…</Grid.Background> 中的部分。在 <LinearGradientBrush> 下直接写 <GradientStop Offset= Color=> 也可以,只要层级关系正确就可以。
7. 标记扩展——一种以非常规方式设置属性的语法,用于不希望对属性进行硬编码的情况下,标记扩展可用于“嵌套标签”或“特性”,当用于特性中时,它被 {} 包含起来,使用 {标记扩展类 参数} 的语法,如 <GradientStop Offset="0.50" Color="{x:Static SystemColors.ActiveCaptionBrush}"/>。因为标记扩展被映射为“类”,所以可以在嵌套中直接写
<Grid.Background>
<x:Static Member="SystemColors.ActiveCaptionBrush"></x:Static>
</Grid.Background>
8. 附加属性,可以用于多个控件,但在另一个类中定义的属性。例如当一个 textBox 放在 Grid 中,textBox 便获得了额外的特性。附加属性使用两个部分的命名形式 定义类型.属性名,如
<Grid HorizontalAlignment="Left" Height="165" Margin="10,10,0,0" VerticalAlignment="Top" Width="497">
<TextBox HorizontalAlignment="Left" Height="23" Margin="88,54,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
<TextBox Grid.Row="2">[This is a Textbox]</TextBox>
</Grid>
注意附加属性根本不是真正的属性,而是被转换为方法调用 Grid.SetRow(textBox,2)
9. XAML 推荐一种构造元素特性的顺序,即先设置 Name 属性(可以不设置),再设置上所有的事件,后边再写属性-特性,这样做的好处是,可以保证所有对属性变化做出响应的事件都可以在第一次设置属性时被执行而不会被落下。
迟到的 WPF 学习 —— 入门的更多相关文章
- 迟到的 WPF 学习 —— 依赖项属性
本章学习依赖项属性,英文原文 Dependency Property,它是传统 .Net Framework 属性的扩展,是 WPF 的专属,但所幸使用起来和传统属性几乎一样.WPF 元素所提供的大多 ...
- 迟到的 WPF 学习 —— 路由事件
1. 理解路由事件:WPF 通过事件路由(event routing)概念增强了传统的事件执行的能力和范围,允许源自某个元素的事件由另一个元素引发,例如,事件路由允许工具栏上的一个按钮点击的事件在被代 ...
- 迟到的 WPF 学习 —— 控件
这一章书中内容比较多而杂,但每个对象的内容又相对简短,所以只挑选里边有代表性的内容做记录. 1. Label 控件:一个基础的简单的 ContentControl,Labe 支持快捷键文本的设置,可以 ...
- 迟到的 WPF 学习 —— 布局
布局是 WPF 很重头的一部分内容,这一部分梳理和记录关于布局章节的知识点. 1. WPF 使用一种基于流(Flow-based)的概念来处理布局逻辑,将传统的基于"坐标"的思想尽 ...
- WPF快速入门系列(1)——WPF布局概览
一.引言 关于WPF早在一年前就已经看过<深入浅出WPF>这本书,当时看完之后由于没有做笔记,以至于我现在又重新捡起来并记录下学习的过程,本系列将是一个WPF快速入门系列,主要介绍WPF中 ...
- WPF从入门到放弃系列第二章 XAML
本文是作者学习WPF从入门到放弃过程中的一些总结,主要内容都是对学习过程中拜读的文章的整理归纳. 参考资料 XAML 概述 (WPF):https://msdn.microsoft.com/zh-cn ...
- WPF自学入门(三)WPF路由事件之内置路由事件
有没有想过在.NET中已经有了事件机制,为什么在WPF中不直接使用.NET事件要加入路由事件来取代事件呢?最直观的原因就是典型的WPF应用程序使用很多元素关联和组合起来,是否还记得在WPF自学入门(一 ...
- WPF自学入门(六)WPF带标题的内容控件简单介绍
在WPF自学入门(二)WPF-XAML布局控件的文章中分别介绍StackPanel,WarpPanel,DockPanel,Grid,Canvas五种布局容器的使用,可以让我们大致了解容器可以使用在什 ...
- wpf学习
http://www.jikexueyuan.com/course/1231_3.html?ss=1 WPF入门教程系列二——Application介绍 http://www.cnblogs.com/ ...
随机推荐
- Java设计模式(四) 装饰 代理模式
(七)装饰 Decorator 装饰是一个对象,以动态地增加一些新功能. 象与被装饰的对象须要实现同一个接口.装饰对象持有被装饰对象的实例. interface DecoratorSourceable ...
- Web项目
Eclipse部署Web项目(图文讲解) 讲解是在linux下完成的,但对windows系统,操作也是一样的,不要被吓到了 1.下载Eclipse
- 关于C#操作INI文件的总结
原文:关于C#操作INI文件的总结 INI文件其实是一种具有特定结构的文本文件,它的构成分为三部分,结构如下: [Section1]key 1 = value2key 1 = value2--[S ...
- Java NIO的多路复用及reactor
(from:http://developer.51cto.com/art/201112/306489.htm) 以下描述,为了说明问题,就提提历史(类似的东西,网上一搜一大把,但是希望你能在这里止步, ...
- JavaScript语法细节——引用与复制
原文:JavaScript语法细节--引用与复制 我们都知道,JS中变量的赋值有两种方式,最近在折腾自己写的标签栏插件,碰到了很多平时没注意的问题.正好,那边处理清楚了,稍微整理一下关于引用与复制相关 ...
- 基于C++ 苹果apns消息推送实现(2)
1.该模块的用途C++ 和 Openssl 代码 它实现了一个简单的apns顾客 2.配套文件:基于boost 的苹果apns消息推送实现(1) 3.最初使用的sslv23/sslv2/sslv3仅仅 ...
- Self referencing loop detected with type
json.net namespace EFDAL{ using System; using System.Collections.Generic; using Newtonsoft. ...
- 登录记住账号和密码小Demo
读取 // 1.读取沙盒中plist文件 // 1.1.获得沙盒根路径 NSString *home = NSHomeDirectory(); // 1.2.拼接Documents路径 NSStrin ...
- vs.net 2013 Saffolding功能扩展
vs.net 2013 Saffolding功能扩展 Asp.net mvc 5 CRUD代码自动生成工具 -Visual Studio.net2013 Saffolding功能扩展 上次做过一个&l ...
- request.getparameter和 request.getattribute的差别
request.getAttribute():是request时设置的变量的值,用request.setAttribute("name","您自己的值");来设 ...