《WPF入门学习ppt课件》由会员分享,可在线阅读,更多相关《WPF入门学习ppt课件(58页珍藏版)》请在金锄头文库上搜索。
1、Windows Presentation Foundation1回顾过去目前大多数基于Windows的用户界面都使用两种主要技术GDI和SER子系统,它们是在1985年随Windows 1.0引进的。不过这几乎已经是技术世界的史前文物了。在二十世纪九十年代早期,OpenGL(由SGI公司创建)成为了一种在Windows或非Windows系统上进行高级2D和3D的图形开发的流行图形库。从事计算机辅助设计、科学的可视化和游戏开发工作的人们大量使用它。DirectX是1995年由微软引进的技术,为2D图形、输入、交流、声音提供新的高性能处理方法,最终扩展到对3D的支持。GDI+是在Windows X
2、P时代引进的,构建在GDI顶层,并添加了对alpha渲染和渐变刷子的支持。2回顾过去近些年,开发人员开始自己尝试创建个性化的Windows应用程序或控件。一个简单的例子是使用位图来制作按钮而不使用标准按钮控件。这些定制化的东西不仅开发起来十分昂贵,而且经常只是产生昙花一现的绚烂效果。这样的应用程序经常变得无法访问;无法运行在部分受信的环境中;在远程桌面中无法很好地显示;也无法很好地处理高分辨率的设置,还会有其他一些可视化的小故障。3WPF的亮点微软公司意识到,我们需要一些崭新的东西来摆脱GDI+和USER的限制,并且它必须是一种生产效率很高的产品,就像Windows Forms那样,WPF就是
3、答案.广泛整合在WPF出现之前,Windows开发人员若需要在普通的2D图形和控件之外再使用3D、视频、语音、富文档视图技术,就不得不学习一些独立技术,这些技术之间通常存在许多不一致,而且是在没有多少内建支持的情况下组合运用它们。而WPF通过统一的编程模型和紧密整合涵盖了所有这些部分,在紧密整合下,各种媒体类型都能组合起来并一起呈现。你可以在不同媒体类型上应用一致的效果,你所学的某个领域中的许多技术可以应用在任何其他领域。4WPF的亮点与分辨率无关想象这样一个世界,在这里切换到高分辨率设置时并不意味着什么东西都变小了,而是让图形和文本的显示更清晰。WPF让这一切变得简单,允许你缩小或者放大屏幕
4、上的元素,却不需要考虑屏幕的分辨率,因为WPF使用矢量图形,使许多这方面的需求变为可能。这个改变很容易在Windows Vista放大镜应用程序中看到,放大镜程序天生就支持WPF矢量图形。5WPF的亮点6WPF的亮点硬件加速虽然WPF是项新技术,但是它是基于Direct3D创建的。特别要注意的是,在WPF应用程序中无论是2D还是3D的图形或者文字内容都会被转换为3D三角形、材质和其他Direct3D对象,并由硬件负责渲染。这意味着WPF应用程序与基于GDI的系统不同,它们可以从硬件加速中获得好处,从而获得更平滑的图像和更好的性能(因为工作全部是由图形处理单元graphics processin
5、g units,GPU完成的,而不是由中央处理单元CPU完成)。它还允许每个WPF应用程序(不仅仅是高端游戏)都可以从新的硬件和驱动中获得最大的好处,因为这些硬件和驱动的发展主要集中在3D处理能力上。7WPF的亮点声明式编程20多年来,Win16/Win32程序都用声明式资源脚本来定义对话框和菜单的布局。虽然Windows Forms没有内建对声明式用户界面定义的支持,但所有类型的.NET程序通常是利用声明式定制属性和基于XML的配置和资源文件。但是WPF通过引入XAML(可扩展应用程序标记语言,Extensible Application Markup Language,读音为Zammel)
6、将声明式编程带入下一个层次。WPF和XAML的组合十分类似于使用HTML定义一个用户界面,但却具有令人吃惊的表示能力。这种表示能力甚至超越了用户界面的范畴,WPF可以将XAML作为一种文档格式、一种3D模型表示,等等。8WPF的亮点富创作和定制(Rich composition and customization)WPF控件具有你从没见过的创作能力。你可以将一些动画按钮放入一个ComboBox控件中,或者将一些视频剪辑放入一个菜单中!易于部署WPF为(使用Windows Installer或lickOnce)部署传统Windows应用程序或在Web浏览器中宿主应用程序提供了选择。一句话,WPF
7、的目的是集众家之所长,将各系统的最佳特性组合起来,如DirectX的3D和硬件加速、Windows Forms的开发人员生产效率,Adobe Flash强大的动画支持,HTML的声明式标记和易于部署。9进入WPF行为与显示的分离行为与显示的分离:WPF 把用户界面的显示和它行为控制完全分离开了。界面通常用由可扩展应用程序标记语言(xaml)生成,而行为则由一个托管的变成语言来实现,如C# 、vb等。它们之间通过数据绑定,事件和命令来相互联系在一起。行为和显示的分离具有以下几个优点: 降低了界面与行为之间的偶合性 设计人员和开发人员可以以各自的模式工作 界面设计工具仅仅工作在一个类似XML的文档
8、上,而不再转化为代码 10WPF 开发流程 用户体验是成功的关键因素:用户体验是成功的关键因素:过去,我们开发一套软件主要在于尽可能满足客户的功能性需求。用户体验则放在开发完成后才考虑。而现在,客户需要的不再仅仅是一个能工作的产品。能够提供正确的功能仍然是一个好产品的先决条件,但把它转向正式产品,那你不得不提供一个良好的客户体验。提供丰富的客户体验不是虚无缥缈的。必须对它计划和设计,然后再把他集成在产品的开发中。设计丰富的客户体验不仅仅是用一些图片、渐变等效果来装饰你的用户界面。它应该在软件和用户之间建立一种情感,应该使用户感觉舒适,以至于他喜欢继续使用你的产品。11XAML介绍 XAML是E
9、xtensible Application Markup Language(可扩展应用程序标记语言)的缩写。它是一种简单的基于XML的用来创建.NET对象及其关系的语言。虽然起初它是为WPF而设计的,用来创建对象树。但现在XAML不仅可用于创建WPF、Sliverlight用户界面,还可以申明Windows工作流(WF)的流程或XPS的标准电子文件。WPF中所有的类都有一个无参的构造函数和灵活的属性应用。其目的就是为了完全适应XML语言,像XAML中。12XAML的优势的优势先说一点就是XAML中所能做的用代码同样可以实现。XAML仅仅是创建和初始化对象的另一种途径。你完全可以不使用XAML来
10、实现WPF应用。在XAML中申明还是在代码里编写完全取决于自己的想法。不过在XAML来申明用户界面有下列一些好处:XAML代码比较简单、清晰、易读 分离的逻辑代码和设计代码 图形设计工具如expression blend都创建的是XAML文件 XAML中逻辑和设计的分离也表示了设计者和开发者角色的独立 13XAML和代码和代码用一个简单的在StackPanel中添加一个文本框和按钮来比较一下XAML和C#代码。 Welcome to the World of XAML OK 14XAML和代码和代码下面是在C# 代码中相同的效果:StackPanel stackPanel = new Stac
11、kPanel(); this.Content = stackPanel; TextBlock textBlock = new TextBlock(); textBlock.Margin = new Thickness(10); textBlock.Text = Welcome to the World of XAML; stackPanel.Children.Add(textBlock); Button button = new Button(); button.Margin= new Thickness(20); button.Content = OK; stackPanel.Childre
12、n.Add(button);你可以很清楚的看到XAML版的是很简洁,易读。这就是XAML表达式的强大之处。15元素即属性元素即属性 从XML语句中可以看出属性一般是内嵌书写的。但是,如果我们想在属性中比如Content中放置一个更复杂的对象,像图像、甚至它本身或者一整张网格面板该怎么做呢。我们可以用元素作属性的语法实现。它允许我们提取属性作为它自己的子元素。 16隐式类型转换隐式类型转换 WPF中一个重要的概念就是隐式类型转换,在后台进行处理。如下面定义了一个BorderBrush,单词“Blue”仅仅是一个字符串。但隐式的BrushConverter会将其转化为一个System.Window
13、s.Media.Brushes.Blue。同样的道理,thickness的值也会隐式的转换为Thickness对象。WPf包含很多这样的内置的类型转换,同时也支持用户自定义的类型转换。 17名字空间名字空间 每一个XAML的开始,都必须包含两个名字空间,第一个是:。它映射了所有在System.Windows.Controls下的WPF控件。第二个是,它映射的是System.Windows.Markup下定义的XAML关键字。XML名字空间和CLR名字空间之间的映射由组装层次(Assembly level)的XmlnsDefinition属性完成。你也可以使用clr-namespace直接在XA
14、ML中引用一个CLR名字空间,例如: 18依赖属性 当你开始用WPF编程的时候,很快就会碰到“依赖属性”。它们和一般的.Net属性看起来很相似,但简单概念之后则是更复杂和更强大。主要的区别在于:平常的.NET属性的值直接读取直接读取于类的一个私有属性,而依赖属性的值则是通过调用继承自DependencyObject的GetValue()方法动态赋值动态赋值的。当你给一个依赖属性赋值时,它不是存储在对象的字段对象的字段中,而是在存储在基类DependencyObject提供的一个键键-值配对的字典值配对的字典中。一条记录中的键(Key)就是该属性的名称,而值(Value)则是想要设置的值。19W
15、PF 布局介绍 控件的布局对于应用程序的易用性是至关重要的。基于像素坐标的控件部署可以工作在限制性的环境中。但是,当你要在不同的显示屏或不同大小的显示设备上时就不那么理想了。WPF提供了一系列丰富的内嵌布局面板可帮助防止一些常见的不足。这是WPF中最常见的5种布局面板:Canvas PanelGrid Panel Stack Panel Dock Panel Wrap Panel 20基本规则基本规则1、防止位置固定:使用Alignment 和Mergin属性的组合在面板中部署元素 2、防止大小固定:尽可能的设置元素的Width和Height属性为Auto 3、不要随便滥用Canvas布局元素
16、,只有在布局矢量图形时使用 4、对话框中的按钮使用StackPanel布局 5、使用GridPanel布局一个数据性表单,为Label设置列的大小为Auto,TextBox设置列为一个星号大小。 6、在DataTemplate中使用网格布局的ItemControl布局键值列表。使用SharedSize功能同步标签的宽度。21垂直对齐和居中对齐垂直对齐和居中对齐使用VerticalAlignment和HorizontalAlignment属性停靠控件。下面图形显示了不同组合的各种效果。22Margin和和PaddingMargin和和PaddingMargin和Padding 经常用于在空间的内
17、外保留空间Margin指定控件外围的空间 Padding指定控件里面的空间 外层元素的Padding就是内层元素的Margin。23Canvas Panel24Canvas Panel left=0,top=0 left=18,top=18 25Canvas.ZIndex left=0,top=0 left=18,top=15 26Stack Panel27 28 29WrapPanel30 31Grid Panel32Dock Panel33Dock Panel 34Grid Panel 35Grid Panel 36ColumnSpan 37GridSplitter 38Grid Pane
18、l模拟39Visibility40Visibility collapsed button below a collapsed button collapsed button below a collapsed button 41应用变化42 43 44RenderTransformOrigin 45Label和TextBlock Label和TextBlock都是System.Windows.Controls命名空间下的类,但二者的父类并不相同。TextBlock继承自System.Windows.FrameworkElement,从这个角度讲,TextBlock不能称之为“控件”(因为它没有
19、继承Control类,关于Control类,我会在WPF Unleashed第四章为大家介绍),而Label继承自System.Windows.ContentControl。FrameworkElement是非常底层的类,它同时也是ContentControl的父类。所以,Label相对TextBlock更加高级一些,它能够完成TextBlock所无法完成的工作。例如对于Access key的支持,而且我们可以在Label内可以放置任意对象,而TextBlock只能显示文本。46文字变形 1234 47缩放 1234 48SkewTransform 49处理内容溢出50换行和截断Wrap Pa
20、nel 自动换行51剪辑 52滚屏53数据绑定 54Mode属性Mode属性有:OneWay 它指明目标的更改不影响源。TwoWay 源和目标同步。 55IValueConverter接口Convert()方法会在值从源转移到目标的时候被调用。ConvertBack()方法会在值从目标传回到源的时候被调用。56ConverterConverter可以是在WPF开发过程中经常用到的一个组件,Converter究竟是什么呢?简单的说,Converter给我们提供了一个绑定源到目的过程中的一个转换器。最常见的用途就是,当我们将元数据绑定到用户界面时,因为不能将元数据直接显示到用户界面,我们要将该数据转换成您想要输出的数据显示到用户界面中。57ObservableCollection当内容更新时,它将给相关的监听者发送通知。58