WPF全称 Windows Presentation Foundation,干啥用的?
主要是用来制做Windows桌面客户端软件的。
.Net平台下制做Windows桌面客户端软件主要有两个,一个Winform,还有一个就是WPF了。html
事件驱动时代:开发客户端便采用Winform,但是界面逻辑跟业务逻辑交织在一块儿,其中的代码隐藏类还包含了不少的事件,这样的结果可想而知了,下降界面的渲染速度,并且代码不太容易维护。
数据驱动时代:微软便开发了专门针对数据的客户端,WPF便所以产生。如今不少网站也是采用的数据驱动模式来开发的,好比国人尤大大开发的Vue,开发的时候只需注重数据,dom操做Vue会给你优雅的自动完成。前端
Winform优缺点:
优势:简单,易控制,不是太占内存的
缺点:代码耦合度高,不利于维护git
WPF优缺点:
优势:支持MVVM模式,能够作出很是绚丽的界面,好比某60杀毒软件,某雷下载软件即是采用这个开发出来的。
缺点:占用的内存稍微高些,学习成本较高,须要理解数据绑定,事件绑定等较多概念。github
干啥用的?很简单,就是专门用来作软件界面的,相似于html语言,也是一种标记语言。
html中定义一个按钮web
1.<button>按钮</button> 2.<input type="button" value="按钮" />
xaml中定义一个按钮后端
1.<Button>按钮</Button> 2.<Button Content="按钮" /> //将Button对象的属性Content经过特性(Attribute)来赋值 3.<Button>按钮</Button> 4.<Button> <Button.Content>按钮</Button.Content> //将属性用做元素 </Button>
在这里有必要说明一下:
属性(Property)与特性(Attribute)是不一样的。
属性是针对面向对象的,一个对象有哪些属性,好比车的颜色,轮胎等,即是所谓的属性。
至于特性,那是专门针对标签的。Property与Attribute并不彻底映射的。大部分Attribute对应于 控件对象 的Property 一个标签,至关于在后台声明了一个对象 意思就是,在后台声明了一个Button对象。
也就是说,接下来的两段代码意思是同样的。服务器
//使用xaml语言编写 <StackPanel> <Button Content="按钮" /> </StackPanel>
//在后置代码中编写 Button button=new Button(); button.Content="按钮"; //Content即是属性,而在标签中,则是特性(Attribute) stackPanel.Children.Add(button);//在哪一个位置添加按钮 StackPanel标签的Name名称
名称空间
其中第二行 xmlns声明的是WPF核心名称空间。它包含了全部WPF类,相比第三行,它没有使用前缀,也就是整个文档的默认名称空间。
第三行 是XAML名称空间。它包含了各类XAML特性。相比第二行,它使用了前缀x。也就是说,能够经过前缀x来使用该名称空间。
x名称空间里面到底有什么呢?
x名称中主要含有标记扩展、特性跟XAML指令元素三大类。dom
名称 | 做用 |
---|---|
x:Class | 指明代码隐藏类,只能用于根节点 |
x:Key | 经常使用在静态资源,经过Key来指定具体的某个静态资源 |
x:Name | 跟标签中的Name特性效果几乎同样 |
x:Code | 在XAML中嵌入指令(几乎不用) |
... | ...固然还有一些其余不经常使用到的,就不说了 |
在XAML中,咱们可能会看到x:Name 跟Name,这二者效果是同样的,都是给相应的对象Name属性赋值。
其中,倒数第三行,声明了第三方的控件名称,也就是说,我能够经过<pu:Button></pu:Button>前缀来使用第三方的控件。svg
你会发现,默认的名称空间,感受是个web中的URI,一开始,我也是这样觉得是引用web服务器上的资源的。其实否则,微软这么作是由于schemas.com域就是他本身的,只有微软会使用它。布局
代码隐藏类(后置代码)
在代码声明中,你会发现 x:Class="" 这个类即是代码隐藏类,和界面是绑定在一块儿的,原理是经过C# partial关键字实现的。在这个代码隐藏类里,咱们能够写该界面所对应的相关事件代码,但这样作容易致使界面代码跟业务逻辑代码耦合在一块儿(Winform即是如此),这并非WPF设计的本意,WPF主要是根据MVVM思想来设计的,经过数据绑定、事件绑定来完全分离先后端,前端只用xaml来写,代码隐藏类里面几乎不写代码,按钮相关事件写在ViewModel里面,这样作,高内聚低耦合,易维护易扩展。
WPF布局模型也是一个重大改进。在WPF问世以前,布局都是采用的坐标,就是位置是锁死的,不会根据窗口的大小自动调整。WPF布局采用的是相似Web中的流布局,控件能够自动的随着窗口的大小自动调整。
一、StackPanel 相似web中的flex布局
这个布局容器很是简单,就是水平(垂直)放置各个控件。一维布局容器。
<StackPanel Orientation="Vertical"> <Button Content="按钮1" /> <Button Content="按钮2" /> <Button Content="按钮3" /> <StackPanel Orientation="Horizontal"> <Button Content="按钮111" /> <Button Content="按钮222" /> <Button Content="按钮333" /> </StackPanel> </StackPanel>
图片:
二、Grid
这个布局容器很是强大,二维布局容器。
它能够指定一个相似表格的,能够任意的定义几行几列。而后相应的控件能够指定放在这个容器的第几行第几列。
<Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Button Grid.Row="0" Grid.Column="0">按钮1</Button> <Button Grid.Row="0" Grid.Column="1">按钮2</Button> <Button Grid.Row="1" Grid.Column="0">按钮3</Button> <Button Grid.Row="1" Grid.Column="1">按钮4</Button> </Grid>
备注:
其中,Button使用了Grid.Column,在Button类中是没有这个属性的,但它是从Grid容器附加的。Grid.Column即是附加属性。
图片:
三、还有一些其余的布局容器:WrapPanel、DockPanel、Canvas等,暂不介绍。
备注:
通常状况下,使用StackPannel跟Grid布局就够了,若是遇到复杂一点的状况下,布局容器相互嵌套即可以解决。
元素:不容许经过指定模板来定制外观
类 | 说明 |
---|---|
Border | 围绕单个控件的边框,能够指定Background、BorderBrush和BorderThickness |
Viewbox | 可以拉伸和缩放子元素 |
TextBlock | 用于显示文本 |
RichTextBlock | 显示富文本 |
Image | 显示图像,支持jpeg、png、bmp、svg,也支持gif动画 |
... | 还有一些其余的,暂不介绍 |
控件:容许经过指定模板来定制外观,这也是WPF的强大之处。
主要包含范围控件、内容控件、按钮、项控件这几个大类。
控件 | 说明 |
---|---|
TeetBox | 用户可输入的文本 |
RichEditBox | 容许输入格式化的文本 |
PasswordBox | 用于输入密码 |
DatePicker CalendarDatePicker CalendarView |
用户选择日期 |
TimePicker | 用户输入时间 |
ColorPicker | 容许用户选择颜色 |
UserControl | 能够重用的控件 |
... | 还有其余的,暂不介绍 |