敬告读者:因为是事件驱动模式的高速学习,高速学习意味着,不系统,不科学,不合逻辑,不一定正确。所以要是有不对的地方,页面下面留言给我,跪谢!


背景介绍:

最近在公司的开发工作中,接手了从别的公司交代过来的代码巨怪,其中主要的技术有 WPF,控制反转框架Spring.net,SqlMap(有点像是ibatis.net),Remoting,作业调度框架Quarz,我们的工作,是把这只怪兽,敲碎,重组并且优化,目标暂时是重构成WebAPI底层和WPF界面两个部分,下面是我学习WPF的过程中,留下的一些很(luan)有(qi)见(ba)地(zao)的笔记。

笔记:

学习开始的时候,我通常要求自己不要分太多精力去关注一个技术的历史,英文全称是什么(Windows Presentation Foundation)这些问题,这个对实际生产,并没有实际作用,我强烈要求自己只关注怎么开始,并且要开始习惯地用 “问题回答框架”(是什么? 为什么? 怎么样? )来执行学习作业。


WPF的“是什么”和“为什么”,我认为需要搞清楚几个事情:

  1. 明明已经有Winfrom,为什么还要有WPF呢?有什么改进?
  2. 最直面地,将会用到什么方面的知识呢?
  3. 同期的技术有什么呢?

1、答:

我是搞Web(asp.net)起家的,Winfrom都不太熟,突如其来的PC界面开发,着实有点措手不及,但是WPF的Xaml界面语言着实让人眼前一亮,既然是ML类语言,那么Xml,Html的语法和Xaml应该如出一辙的,于是剩下的,马上就只剩下标签的熟悉程度问题了,这对Web开发者而言,是个极大的利好消息。

WPF从某个意义上说是很像 Winfrom的,你可以很Winfrom地开发WPF,新建一个WPF解决方案之后,直接拖一个控件(button)到界面上,然后双击增加事件。

但是它也可以很网页地开发某些From,比如想做一个登录窗口,你必然会想到这样子的Html代码:

姓名:<input type="text" id="txtUserName">
密码:<input type="password" id="txPassword">
<input type="submit" id="btnSubmit" value="提交">

  于是这么看来WPF也提供了这样一种类似的结构:

<Button x:Name="btnPageEvent" Content="点我!" Margin="441,0,0,0" Click="btnPageEvent_Click"/>

  在这一点上Winfrom给我的感觉是特别麻烦,你通常只能通过拖拽的方式添加控件,如果要写代码添加,disigner.cs的代码可读性真是可以看得人作呕的,这意味着什么,这意味着,界面的开发和代码的开发分离了,而且界面代码的复用能力增强了许多许多。

2、答:

最直面的,当然就是上面提到的Xaml,然后有MVVM框架,然后要像Html+CSS那样谈表现和内容分离,然后要谈SilverLight(虽然当前还没学习到,但是我感觉WPF的动画是让人兴奋的)

3、答:

WPF有几个同窗,WCF,WF,新一期的MVC框架等等,都是非常有竞争力,有吸引力的知识和工具。为什么要知道这个呢?因为我一定会把WPF和WCF


接下来怎么样开始好呢?

首先这不是从头开始自己开坑,这是别人家公司搞了好几年的代码,别人家公司的知(yuan)识(shi)产(ju)权(keng),给你代码已经很对得起你了,怎么可能有文档呢?

实践出真知,当然是要开始写了,才会懂的,我简单地整理了下代码怪兽里面的一些经常出现的控件和单词,通过书籍《WPF编程宝典:使用C# 2012和.NET 4.5(第4版)》,我简单地将他们分到了以下几个类别里面:

  • WPF的基本控件(Button,Radio,CheckBox,DataGrid,等等) //(大家都要有的啦!)
  • WPF的布局控件(Grid,StackPanel,Border等等)                   //(布局这个单词在PC的软件上看见是件值得让人感动的事情)
  • 元素的绑定(Binding,ObservableCollection)                           //(MVVM的ViewModel绑定操作)
  • 元素的外部资源,样式或者转换器(StaticResource)                     //(表现和内容分离)
  • 事件的触发器(Triggers,EventTrigger,ICommand)

嗯,于是问题来了,我发现经常会有这样的写法:

 Style="{StaticResource SimpleButton}"
CommandParameter="{Binding ElementName=gdTaskList, Path=SelectedItem}"
Binding="{Binding CreateTime, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource dateTimeConverter}}"

这时候我不禁不断得吐槽,这都什么鬼啊……

  • => Binding里面还套着一个Json格式的对象,对象里面还有一个Binding?
  • => StaticResource,这是哪里的Resource?哪里引入进来的呢?
  • => Mode, UpdateSourceTrigger, Converter都哪里来的属性,自己带的么?
  • => Converter 你又调皮了,怎么又带上一个StaticResource了,这不元素样式的资源么?怎么跑来转换器这了?

不,不能再继续下去了,这样是很凌乱的。人家是大团队,人家绝对不是傻瓜,毕竟是几年的代码,再乱,都有它的章法。我们要暂时放下工作上的这一切,学习一点基础知识才对:

MVVM:

这个东西可能对于传统的程序员们而言会有点难理解,大家都非常习惯MVC的一套,用户向Controler提出请求,然后Controller把View和Model结合在一起带到用户面前;也非常喜闻乐见地用三层开发。

(我的学习顺序或许有点非主流,我是先学习了Web上面的Knockout.js,对MVVM有一个初步的了解,再学习的WPF。)

我是这么理解MVC和MVVM的:

我们做的页面,我们取出来的数据,分别是两个对象,对于MVC来说,我们看到的页面和数据,是Controller从数据中一个一个地找到对应的属性,并且贴到View对应的地方去的,注意是一个一个地找到;而对于MVVM而言,我们看到的页面和数据,就是预先标记好这里要填写什么的页面,然后把数据啪的一下,叠在页面上面。

可能说的不清晰,我举个例子吧,不知道读者小时候有没有见过很老式的投影仪(胶片投影机,见上图),不过现在基本都配备了高级的投影仪和实物投影,我小时候上课的时候,老师会把习题先写在一张透明的胶纸上,然后拿另一张胶纸叠在习题的上面,写上答案。上课的时候老师先把写着习题的一张投影出来,大家做练习,然后,再把写着答案的一张叠在习题的上面,这样就可以对答案了。嗯,我这里讲的就是“叠”的这个操作,这个操作给我的感觉其实很像MVVM的绑定操作。

建立项目:

只有3.5的.net FrameWork才有WPF的,所以代码开发工具最好是2010以上(大家快去下载2015的community版本吧,免费的咯)。

新建项目,就是 文件->新建->项目...

嗯,这个倒是难不倒我……

结束:

嗯,我们还没有写一句代码,就结束了,

确实几个月的收获也不止这么一点,

是的,饭要一口口吃的,笔记也要一点点整理的,

但是我觉得还是开了个好头的,

起码对我来说是的……

WPF的学习笔记(1) -- (积累自2016年5月1日 至 2016年6月1日)的更多相关文章

  1. 【WPF】学习笔记(三)——这个家伙跟电子签名板有个约定

    这篇博客依旧是以电子签名板为基础而展开的,主要是对前文([WPF]学习笔记(一)--做一个简单的电子签名板)存在的部分问题进行解释,以及部分小功能的添加.由于这篇博客是建立在学习笔记一的基础上的,所以 ...

  2. WPF-学习笔记 动态修改控件Margin的值

    原文:WPF-学习笔记 动态修改控件Margin的值 举例说明:动态添加一个TextBox到Grid中,并设置它的Margin: TextBox text = new TextBox(); t_gri ...

  3. WPF开发学习笔记(转)

    总结下学习WPF的笔记,方便查阅 1   编译 添加程序集引用:WindowsBase.dll,PresentationCore.dll,PresentationFramework.dll 2  布局 ...

  4. 《深入浅出WPF》 学习笔记

    <深入浅出WPF> 序言 1. 什么是WPF    2. 为什么要学习WPF 第一章 XAML概览 1. XAML是什么? 2. XAML有哪些优点 第二章 从零起步认识XAML 1. 新 ...

  5. 【WPF】学习笔记(一)——做一个简单的电子签名板

    参加实习(WPF)已经有两个多周的时间了,踩了一些坑,也算积累了一些小东西,准备慢慢拿出来分享一下.(●'◡'●) 这次呢就讲讲一个简单的电子签名板的实现. 先上张图(PS:字写得比较丑,不要太在意哈 ...

  6. 【WPF】学习笔记(二)——依旧是一个电子签名板

    这篇博客呢,主要谈谈在实现电子签名功能中踩过的几个坑:1.System.BadImageFormatException异常:2.无法加载DLL“###.dll”,: 找不到指定的模块. (异常来自 H ...

  7. WPF基础学习笔记整理 (九) 资源

    基础知识: WPF的资源是一种保管一系列有用对象的简单方法,方便于重用. WPF UI元素的Resources属性,都是继承自FrameworkElement列,且其类型为ResourceDictio ...

  8. WPF基础学习笔记整理 (八) 命令

    基础知识: 命令是应用程序的任务,并跟踪任务是否能够被执行. 命令不包含执行应用程序任务的代码. 命令是比事件更高级的元素.默认的命令目标是当前获得焦点的元素. 良好的Win应用程序,应用程序逻辑不应 ...

  9. WPF基础学习笔记整理 (七) Binding绑定

    基础知识: 数据绑定是一种关系,该关系告诉WPF从源对象提取一些信息,并用这些信息设置目标对象的属性:目标对象始终是依赖属性,而源对象则可以是任何内容. BindingOperations类,提供静态 ...

随机推荐

  1. springmvc之格式化要显示的小数或者日期。

    把保存的小数或者日期按照想要的格式显示. 首先导入jar包joda-time-2.3.jar,下载地址http://pan.baidu.com/s/1gfNuUfp 这里使用注解的方式进行格式化. 创 ...

  2. 亿级Web系统搭建——单机到分布式集群

    当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...

  3. Javascript模块化编程(三):require.js的用法(转)

    这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的 ...

  4. SQLServer2008R2企业版密匙

    SQLServer2008R2企业版密匙:  R88PF-GMCFT-KM2KR-4R7GB-43K4B 

  5. URL请求工具

    工作中有个需求,定期请求多个URL.“定期”采用计划任务实现,请求URL,虽说start url可以实现,但不灵活.自己制作了个专门请求URL的工具,并记录请求结果. 控制台程序代码: class P ...

  6. final发布评论

    在刚刚过去的final发布会上,各小组都展示了自己团队两个月来的团队成果.以下是我对各小组的发布 过程和产品展示的评论. 1.金州勇士团队 金州勇士团队的作品是在线考试系统.从产品的角度来说,相比于b ...

  7. C++多级指针与多维数组详细介绍

    多级指针的概念 多级指针可对应于多维数组,这种指针变量中存的是另一个指针变量的地址,其说明如下:    int val=10;    int *ptr=&val;    int **pptr= ...

  8. Mysql中的少用函数

    1.查询时需要转换类型,大多发生在数字和字符串.时间和字符串之间 Mysql提供了两个个类型转换函数:CAST和CONVERT CAST() 和CONVERT() 函数可用来获取一个类型的值,并产生另 ...

  9. 日常总结——JSP篇(补)

    序—— 初次接触JSP,写一个登录注册界面 正文—— JSP介绍:JSP通过在标准的HTML页面中插入java代码,其静态的部分无须java程序控制.每个JSP页面就是一个servlet实例, WEB ...

  10. windows防火墙命令

    删除防火墙:netsh advfirewall firewall delete rule name=%gate_rule_name% 添加防火墙:netsh advfirewall firewall ...