深入浅出WPF(1)——什么是WPF 2008-05-15 19:06:00

 
小序:
 
Hi,大家好!几乎两个月没有写技术文章了。这两个月,我在学习WPF。回顾一下两个月的学习历程,有两个感觉——第一,WPF是一项非常实用又简单易学的东西,它将成为未来MS平台上快速开发的主流趋势;第二,WPF的学习比较讲求路径,如果没有一个比较好的路径,学习起来可能比较慢,主要原因是它像是一种ASP.NET与Windows Forms的“杂交品种”,里面有很多内容与前两者似像非像,同时还有很多新内容的引入。
 
本系列文章的主要目标是:帮助大家学习WPF技术,快速成为这项技术的开路先锋。在此,我借CSDN一块宝地,把这两个月来学习到的东西做一个整理,奉献给大家。希望大家能喜欢。BTW,本系列文章的风格将一改以前长篇累牍的样式,改变为非常短小的篇幅,每篇文章一两个知识点,小步快跑、天天积累。这样,我写着不累,你看着也不累。
 
在我两个月的学习中,我的同事们——Anstinus、 Mathew、 Allen、 ChengSong、 Edward和Mike——他们像战场上的战友一样给了我无数的帮助。在这里,我向这些同事表示深深的感谢和敬意。还有我的搭档——大美女Yan,和你在一起工作很开心。
 
正文:
 
什么是WPF
 
WPF,Windows Presentation Foundation也,译过来就是“Windows呈现基础”,你看它的目的非常明确,就是用来把数据“显示”给用户看的(说白了就是用来做UI的)。如果只是给用户显示几串文本、两三张图片或者几个表格那WPF就太糗了,幸乎,WPF可不是这等素食动物——大家都见过Flash动画吧,WPF的显示能力丝毫不亚于Flash以及Flash的同门师弟Flex+AIR(某建筑公司产品)。
 
为什么会有WPF
 
“微软出点儿什么新东西,我就得跟着跑!”我也曾这样抱怨过。不过,当大量的工作任务压在头上的时候,我终于感觉到——每一次技术(包括理念、架构、语言、工具)的更新都带来了巨大的工作效率提升。的确,我们需要花些时间来搞懂那些看起来乱糟糟的新概念,但搞明白之后——坦白地讲,在有人带的情况下,这并不是什么难事——我们就能用非常少的代码来换取先前技术大量代码才能获得的功能。似乎代码量是开发团队中一切糟糕问题的罪魁祸首,so,明白了?
 
对于WPF是如何减少代码量的,后面有一个例子。但WPF绝不是一个只能帮我们减少代码量的家伙,更重要的是,它还能帮我们把程序的界面和功能逻辑近乎彻底地剥离——in a nutshell,把你的程序变成一只香蕉或者橘子——“皮”是可以从“瓤”上剥下来的,一旦某天用户说:“这个橘子能不能看起来像是个香蕉?”你就可以为你的橘子瓣儿裹上漂亮的进口香蕉皮再开出一个更漂亮的价码。
 
WPF是怎样做到的
 
使用WPF技术开发产品,程序的“皮”,也就是UI,是使用XAML语言来“画”出来的;而程序的“瓤”,也就是功能逻辑,可以由程序员来选择使用C#/VB.NET/C++.NET等托管语言来实现。
 
对于程序员们来说,C#/VB.NET/C++什么的已经是耳熟能详。XAML是什么呢?简言之,XAML(读音为“zamel”,近似于“咋没有”)是XML语言的一个衍生物,它的语法基本上与XML语言完全一致;它的功能就是专门用来设计和实现程序的UI;它看起来和HTML语言非常像,无论你是程序员还是美工人员,只要你设计过网页,那学习XAML对你来说都是小菜一碟儿。而且,XAML可不像HTML和XHTML那样只能呆在Web开发领域——XAML对于Web开发和桌面开发是“通吃”的,从Web程序改成桌面程序或者反过来,所付出的工作量惊人的小,而且由于UI与逻辑完全分离,逻辑代码几乎不用改动——这意味着两种开发的边界渐渐消失,两类设计人员和程序员将会染指“彼岸”、拿到更多的项目、挣更多的钱。
 
WPF之前,无论是Win32 API编程、使用MFC编程还是Windows Form编程,美工(设计人员)设计出来的界面都需要由程序员使用Visual Studio来实现。程序员不是美工,VS也干不过PS……越俎代庖永远是高效分工的大敌。如今,为了支持WPF程序设计,微软推出了专门的、使用XAML语言进行UI设计工具——Expression Studio,使用它就像使用PhotoShop和Dreamweaver一样,设计出来的结果保存为XAML文件,程序员可以直接拿来用;当UI有变更时,程序员只消用新版XAML文件替换旧版即可。
 
XAML小试牛刀
 
让我们实现这样一个小小的需求,完全使用XAML代码而不需要C#来参与。用户需要一个窗口,里面有一个TextBox和一个Button,并且窗口的背景是蓝色的过渡色。
 
650) this.width=650;" onsubmit onchange onunload onselect onreset>
 

我保证:真的一行C#代码都没写!是不是足以让Windows Form程序员艳羡不已?!
 
一切实现都是使用XAML语言完成的——你可以使用Visual Studio 2008的XAML设计器来完成,也可以使用Expression Studio来更专业地完成设计。下面是它的XAML代码,你现在只需要看个大概,后面的文章里,我会一个词一个词为你解释。
 
<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Grid.Background>
            <LinearGradientBrush>
                <GradientStop Offset="0" Color="Blue"></GradientStop>
                <GradientStop Offset="0.5" Color="LightBlue"></GradientStop>
            </LinearGradientBrush>
        </Grid.Background>
        <TextBox Height="23" Margin="10,10,10,0" Name="textBox1" VerticalAlignment="Top" Text="Hello WPF!" />
        <Button Height="23" HorizontalAlignment="Right" Margin="0,40,10,0" Name="button1" VerticalAlignment="Top" Width="75">WPF</Button>
    </Grid>
</Window>
 
咱们再来一个例子:这回的需求是这样的——UI上有一个TextBox和一个Slider,要求Slider的滑块滑动时TextBox的文本显示Slider的值;当TextBox里的文本改变时,就让Slider的滑块与之同步。
 
对于一个有经验的Windows Form开发老手来说,他的思路是这样的:
  1. 在UI上拖放控件
  2. 为Slider的ValueChanged事件添加响应函数(事件处理函数),函数中将Slider的Value属性(double类型)转换成一个string类型的值并赋给TextBox的Text属性。
  3. 为TextBox的TextChanged事件添加响应函数,对TextBox的Text属性进行检验,看看它是否能解析为一个double值(新手常常忘记这一点而导致bug)并且落在Slider的取值范围内,如果一切顺利,就把它赋给Slider的Value属性。
 
Now,你是一个WPF新手,但你可以做的比一个Windows Form老手还好!请打开Visual Studio 2008,新建一个WPF Application,然后把下面的代码copy到XAML设计器里。
 
<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Grid.Background>
            <LinearGradientBrush>
                <GradientStop Offset="0" Color="Blue"></GradientStop>
                <GradientStop Offset="0.5" Color="LightBlue"></GradientStop>
            </LinearGradientBrush>
        </Grid.Background>
        <TextBox Height="23" Margin="10,10,10,0" Name="textBox1" VerticalAlignment="Top" Text="{Binding ElementName=slider1, Path=Value, UpdateSourceTrigger=PropertyChanged}" />
        <Slider Height="21" Margin="10,40,10,0" Name="slider1" VerticalAlignment="Top" Maximum="100" />
    </Grid>
</Window>
   
看你,你也可以一句C#代码都不写就完成漂亮的程序!
 
650) this.width=650;" onsubmit onchange onunload onselect onreset>
 
我猜已经有同学开始“晕代码”了。完全没有必要!这些代码80%都是VS自动生成的,而且它们的结构的非常简单——箱子里装着一个口袋,口袋里装着两个核桃。上面这段程序最重要的一句就是:Text="{Binding ElementName=slider1, Path=Value, UpdateSourceTrigger=PropertyChanged}",即可以说它是WPF最精华的部分,也可以说它是与Windows Form开发相比变化最大的地方,它就是——Data Binding(数据关联)。这两个月来,我几乎天天与这个东西打交道。后面的文章中,我们将仔细学习如何使用它。

深入浅出WPF(1)—转(http://liutiemeng.blog.51cto.com/120361/91631/)的更多相关文章

  1. [转]深入浅出WPF(7)——数据的绿色通道,Binding

    本文转自:http://liutiemeng.blog.51cto.com/120361/95273 小序: 怎么直接从2蹦到7啦?!啊哦,实在是不好意思,最近实在是太忙了,忙的原因也非常简单——自己 ...

  2. 《深入浅出WPF》笔记——事件篇

    如果对事件一点都不了解或者是模棱两可的话,建议先去看张子阳的委托与事件的文章(比较长,或许看完了,也忘记看这一篇了,没事,我会原谅你的)http://www.cnblogs.com/JimmyZhan ...

  3. 解决Eclipse中文乱码 - 技术博客 - 51CTO技术博客 http://hsj69106.blog.51cto.com/1017401/595598/

    解决Eclipse中文乱码 - 技术博客 - 51CTO技术博客  http://hsj69106.blog.51cto.com/1017401/595598/

  4. 网管把握市场需求,其实一点都不可怜 转载于 [http://tonyxiaohome.blog.51cto.com/925273/955589]

    呵呵,这是我到51CTO做实习斑竹,回复的第一篇帖子,原帖在这里: http://bbs.51cto.com/thread-940532-1.html 这位朋友可能最近受到点挫折,所以有点小灰心,我呢 ...

  5. 深入浅出WPF开发下载

    ​为什么要学习WPF? 许多朋友也许会问:既然表示层技术那么多,为什么还要推出WPF作为表示层技术呢?我们话精力学习WPF有什么收益和好处呢,这个问题我们从两个方面进行回答. 首先,只要开发表示层程序 ...

  6. http://linuxme.blog.51cto.com/1850814/372960

    http://linuxme.blog.51cto.com/1850814/372960 http://os.51cto.com/art/201404/435129.htm

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

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

  8. 《深入浅出WPF》重点摘要(—)Binding自动通知机制

    最近因为公司的项目需要用WPF开发,就学习了一下WPF.刚开始只是用到什么就百度什么,虽然功能是实现了,但还是没有弄清楚原理(如果不弄清原理,会感觉很心虚,整个人会没底气),所以决定找个教程系统地学一 ...

  9. http://nxlhero.blog.51cto.com/962631/1666250?plg_nld=1&plg_uin=1&plg_auth=1&plg_nld=1&plg_usr=1&plg_vkey=1&plg_dev=1

    http://nxlhero.blog.51cto.com/962631/1666250?plg_nld=1&plg_uin=1&plg_auth=1&plg_nld=1&am ...

随机推荐

  1. 实现自己的js框架

    两年前写的,现在发出来,也当是一个记录. 我知道贴代码有些人会反对,觉得应该用文字讲细致,但是我觉得用文字我没发用简单的文字来表达,看代码反而更直接,这个是见仁见智的. 很早之前一直用extjs,这个 ...

  2. 李洪强 - C语言8-Scanf函数

    C语言的scanf函数 一.变量的内存分析 (一)字节与地址 ①. 内存以字节为单位 每个字节都有自己的内存地址,根据地址就可以找到该字节.整个内存相当于一整个酒店,而酒店以房间为单位,在这里每个房间 ...

  3. php 类

    <?php class mysql{ private $host; private $name; private $pass; private $table; private $ut; func ...

  4. kail-linux 下载地址

    http://archive-6.kali.org/kali-images/kali-2016.1/kali-linux-2016.1-i386.iso 选择debian 32/64bit安装 开始启 ...

  5. 新浪微博API开放平台进行程序开发第一步(java)

    申请开发者权限步骤: 1.登录sina微博,点击“应用” 2.点击“微博开发平台 我也要做开发者” 3.点击“我的应用”,填写“开发者信息” 4.点击“创建应用”,就是你将要开发的微博应用程序,可以是 ...

  6. 去掉网址中的 html编码

    修改 web\urlManager  createUrl函数,去掉 urlEncode函数

  7. HDU 1688 Sightseeing&HDU 3191 How Many Paths Are There(Dijkstra变形求次短路条数)

    Sightseeing Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  8. CSS3 2D Transform

    在 一个二维或三维空间,元素可以被扭曲.移位或旋转.只不过2D变形工作在X轴和Y轴,也就是大家常说的水平轴和垂直轴:而3D变形工作在X轴和Y轴之外, 还有一个Z轴.这些3D变换不仅可以定义元素的长度和 ...

  9. JS对json对象的调用成员2种方式

    1,控制台上对json对象的调用 //控制台上对json对象的调用 var a={"a":"1","b":"2"} a. ...

  10. POJ 1062 dij

    一道读题读的不明所以的题... 每个人只能接受和自己等级差距不超过m的人进行交易 包括间接交易 所以我们可以枚举每一个长度为m的围绕着酋长的等级区间 每次都对这个等级区间内的人进行操作 求dis[1] ...