WPF基础知识

学习WPF,我们应该只集中精力弄清楚几个基本问题:什么是WPF?为什么要用WPF?怎么用WPF?

第一,什么是WPF?

WPF是伟大的M$提出的众多编程新概念的中的一个,是“Windows Presentation Foundation”的简称,翻译过来大意就是说是开发“表示层”(最简单的理解就是程序界面)的技术和工具。

有人问,WPF只做界面的话,后台的逻辑怎么办?答曰:随便你怎么办。其实,WPF主要就是实现界面相关的内容,对于后台的逻辑,包括业务逻辑层和数据层,则不限于你使用什么样的技术,比如你可以使用微软的WCF和WF(你看名字就知道,这本来就是一套,伟大的M$从一开始就为你准备了一桌大餐而不是单独一道大菜)。

最后,一句话总结什么是WPF,答曰:做界面的!

科普一下相关概念:被热炒的Silverlight,其实也是和WPF关系匪浅,有一个说法是Sliverlight本来就是WPF的一个子集,是WPF的“网络版”。

第二,为什么要用WPF?

表面原因:WPF开发界面很好很酷很炫。

直接原因:公司/客户/老板/上司 的要求。

间接原因:M$不遗余力地推广。

个人总结原因:WPF使用了独立的XAML语言,使得开发的界面真正和界面后的逻辑分离开了,这样就带来了种种方便,比如擅长修改界面的设计人员就不用老是和只会写代码的程序员反复沟通,他们只需要掌握XAML语言,就能设计出非常精巧地界面(XAML语言是什么?下面再介绍)。另外,笔者总有点感觉,似乎现在有一种潮流,那就是一切向网络看齐,WPF是针对界面程序的,但是感觉使用了XAML语言后,感觉和HTML的页面设计风格就很相似了,使用微软提供的Blend,有网页设计功底的设计人员就可以惬意地在Windows开发出各种绚丽的界面;从网络上的资料来看,XAML写的文件,可以在Windows中被调用,也可以被安装了Silverlight的浏览器访问,这就极大地节约了开发时间,尤其是其模糊了BS和CS系统的界限,这将使得开发应用于多种客户端的大型系统变得更加有效率(比如写一个系统,可以用Windows PC桌面程序访问服务器,也可以用IE访问服务器,甚至可以用手机来访问服务器,他们的界面可以统一使用XAML来开发)。

第三, 怎么用WPF?

这个问题似乎太大了点,我这里只能简单说说最基础的东西,看了觉得说得太浅了的不许吐槽。

WPF里面分成两部分,一部分是XAML语言,一部分是C#代码。在WPF里面,这两部分是独立到但是又紧密联系到一起的。其中,XAML语言是定义界面元素本身的,而C#则是实现界面上各种消息响应函数的。比如,你点击一个按钮,那么对应的消息响应函数就可以用C#来完成;但是按钮本身的形状、颜色、背景、尺寸等等,则一般都是在XAML中定义的。

独立:这两部分内容是分别放在不同的文件中的,后缀名分别是.xaml和.cs。开发的时候,完全可以让界面设计人员开发.xaml文件的同时,C#程序员开发.cs文件。

紧密联系:在.cs文件中使用了C#中的partial关键字,将一个.xaml文件和一个.cs文件中相关的内容结合起来,形成一个类。也就是说,每一个.xaml文件中定义的xaml对象,实际上也可以看做一个C#中的类。

注意:在WPF中,一些和消息响应相关的特效,比如”鼠标移动到指定控件上,控件颜色会变“等,这些特效可以由C#用消息响应来实现,但是也可以通过XAML的Trigger机制来实现;另外,在C#中,可以通过XAML中定义的控件的名字来访问指定的控件,修改控件的属性,甚至可以直接创建控件添加到界面上,实现对WPF界面的控制。从这个意义上说,XAML高手和C#大虾都可以完成一个漂亮的WPF界面,但是显然XAML开发的界面显然比C#更加有优势,毕竟撇开代码的通用性不说,使用Blend设计界面的工作效率之高和工作结果之绚丽,就不是傻傻地敲代码可以比拟的。真实开发的时候,应该很多时候都是设计人员使用Blend完成界面,然后生成的XAML代码文件交给C#程序员进行微调,最后生成最终的界面文件。

C#就不多说了,这里特别说一下XAML语言的一个基础概念:属性赋值的两种形式。

XAML语言是XML语言的一个子集,换句话说,XML语言的特性XAML都会有。XML的标志:用形如<></>之类的树形结构的标签定义一个个元素和元素的值。在XAML中则是定义了一个个控件和控件中的元素,以及<style>之类的东西。注意,和HTML一样,XAML中设置界面也是用的标记语言。关于标记语言,有一个很基本的概念:属性的值可以放在<>中用“=”来赋值,也可以在<>外直接用属性元素(Property Element)来赋值。下面是一个简单的例子,该例子中,定义了Grid的三行,每行宽度都是60,第一行使用的属性元素,第二行用的是赋值语句加字符串来进行赋值。这两种方法是等价的。不过需要注意的是,用赋值语句的话,代码比较简洁;属性元素赋值,则适用于复杂属性。比如例子代码中,实际上Grid.RowDefinitions可以看做是Grid的一个复杂属性,在属性中又有若干子属性,这样的复杂属性很难用简单的字符串来赋值。

最后,一定要注意,字符串赋值也好,属性元素也罢,最后实际赋值给属性的,应该都是对象;至于字符串和属性元素如何转化成对象,那就得去问微软了。实际上,如果不用XAML,而是使用C#对属性进行的话,那么使用者就会发现,很多情况下,都得自己想办法来生成一个个对象来赋值给某些属性。

<Window x:Class="MyFirstWpfApplication.Win_Test1"         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"         Title="Win_Test1" Height="300" Width="300">     <Grid>         <Grid.RowDefinitions>             <RowDefinition>                 <RowDefinition.Height>                     60                 </RowDefinition.Height>             </RowDefinition>             <RowDefinition Height="60"/>             <RowDefinition Height="60"/>         </Grid.RowDefinitions>              </Grid> </Window>
原文地址:https://www.cnblogs.com/Ruiky/p/2421391.html