之所以说“迟到的”,是因为我太晚才开始学习 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 学习 —— 入门的更多相关文章

  1. 迟到的 WPF 学习 —— 依赖项属性

    本章学习依赖项属性,英文原文 Dependency Property,它是传统 .Net Framework 属性的扩展,是 WPF 的专属,但所幸使用起来和传统属性几乎一样.WPF 元素所提供的大多 ...

  2. 迟到的 WPF 学习 —— 路由事件

    1. 理解路由事件:WPF 通过事件路由(event routing)概念增强了传统的事件执行的能力和范围,允许源自某个元素的事件由另一个元素引发,例如,事件路由允许工具栏上的一个按钮点击的事件在被代 ...

  3. 迟到的 WPF 学习 —— 控件

    这一章书中内容比较多而杂,但每个对象的内容又相对简短,所以只挑选里边有代表性的内容做记录. 1. Label 控件:一个基础的简单的 ContentControl,Labe 支持快捷键文本的设置,可以 ...

  4. 迟到的 WPF 学习 —— 布局

    布局是 WPF 很重头的一部分内容,这一部分梳理和记录关于布局章节的知识点. 1. WPF 使用一种基于流(Flow-based)的概念来处理布局逻辑,将传统的基于"坐标"的思想尽 ...

  5. WPF快速入门系列(1)——WPF布局概览

    一.引言 关于WPF早在一年前就已经看过<深入浅出WPF>这本书,当时看完之后由于没有做笔记,以至于我现在又重新捡起来并记录下学习的过程,本系列将是一个WPF快速入门系列,主要介绍WPF中 ...

  6. WPF从入门到放弃系列第二章 XAML

    本文是作者学习WPF从入门到放弃过程中的一些总结,主要内容都是对学习过程中拜读的文章的整理归纳. 参考资料 XAML 概述 (WPF):https://msdn.microsoft.com/zh-cn ...

  7. WPF自学入门(三)WPF路由事件之内置路由事件

    有没有想过在.NET中已经有了事件机制,为什么在WPF中不直接使用.NET事件要加入路由事件来取代事件呢?最直观的原因就是典型的WPF应用程序使用很多元素关联和组合起来,是否还记得在WPF自学入门(一 ...

  8. WPF自学入门(六)WPF带标题的内容控件简单介绍

    在WPF自学入门(二)WPF-XAML布局控件的文章中分别介绍StackPanel,WarpPanel,DockPanel,Grid,Canvas五种布局容器的使用,可以让我们大致了解容器可以使用在什 ...

  9. wpf学习

    http://www.jikexueyuan.com/course/1231_3.html?ss=1 WPF入门教程系列二——Application介绍 http://www.cnblogs.com/ ...

随机推荐

  1. Jenkins + robot framework + git持续集成

    安装略过... 一.Jenkins安装插件 进入系统管理—插件管理—可选插件下安装以下插件Git Client Plugin.GIT plugin.GitHub API Plugin.GitHub p ...

  2. ASP.NET 5简介

    ASP.NET 5简介 解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介 2015-05-13 09:14 by 汤姆大叔, 3379 阅读, 39 评论, 收藏, 编辑 ...

  3. linux_根据关键词_路径下递归查找code

    1:进入想查找的项目根目录 2:根据关键词查找 find . -name "*" |xargs grep -F '10.26'

  4. JavaEE Tutorials (1) - 概述

    1.1 Java EE 7平台新增特性3 1.2 Java EE应用模型3 1.3 分布式多层应用4 1.3.1 安全4 1.3.2 Java EE组件5 1.3.3 Java EE客户端6 1.3. ...

  5. 【翻译自mos文章】v$undostat视图没有依照每10分钟进行更新,v$undostat仅仅有1行(one rows)

    v$undostat视图没有依照每10分钟进行更新,v$undostat仅仅有1行(one rows) 參考原文: The V$UNDOSTAT view is not getting updated ...

  6. webkit 子资源加载过程

    从主控文档和子资源表单的页面.描述框架记叙文页主文档,布局.子元素.包含图片.CSS.JS等.为了显示网页,先要把资源载入到内存. 载入就是指把须要的资源载入到内存这一过程. Webkit用到非常多缓 ...

  7. 【百度地图API】如何调整结果面板的样式?如何获取指定页码的结果?

    原文:[百度地图API]如何调整结果面板的样式?如何获取指定页码的结果? 摘要: 1.你是否想自定义查询后,结果面板的显示样式? 2.数据接口每次只返回10条结果,如何取到单独每一页的结果? ---- ...

  8. [CLR via C#]7. 常量和字段

    原文:[CLR via C#]7. 常量和字段 7.1 常量 常量(constant)是一个特殊的值,它是一个从不变化的值. 在定义常量时,它的值必须在编译时确定.确定之后,编译器将常量的值保存到程序 ...

  9. angularJS之使用指令封装DOM操作

    angularJS之使用指令封装DOM操作 创建指令 指令也是一种服务,只是这种服务的定义有几个特殊要求: 必须使用模块的directive()方法注册服务 必须以对象工厂/factory()方法定义 ...

  10. 关于Android开发中导出jar包后的资源使用问题解决

    我们经常遇到一个需求,就是给别人使用我们工程的时候,为了能够屏蔽代码,把代码封装成jar包提供给第三方使用,但是这样我们的资源文件怎么给对方用呢? 其实并不用这么的复杂,下面就介绍一下具体的方法 一, ...