280 likes | 480 Views
WPF 编程基础. API(Application Programming Interface) 是 Windows 操作系统编写 Windows 应用程序函数库,库中函数采用 C 语言调用格式。用 C 语言直接调用 API 函数也可以编制 Windows 应用程序,但大量的代码必须由程序员自己编写,给编程者带来很大的困难。
E N D
API(Application Programming Interface)是Windows操作系统编写Windows应用程序函数库,库中函数采用C语言调用格式。用C语言直接调用API函数也可以编制Windows应用程序,但大量的代码必须由程序员自己编写,给编程者带来很大的困难。 .Net FrameWork中包括编写Windows应用程序、Web应用程序的基础类库(BCL),它是一个统一的、面向对象的、层次化的、可扩展类库,统一了微软当前各种不同框架和开发模式,无论开发Windows应用程序,还是开发Web应用程序,采用相同组件名称,组件具有类似属性、方法和事件,开发模式也相似,方便学习。该类库支持控件可视化编程。VC++.Net、VB.Net、C#语言都使用这个类库,消除了各种语言开发模式的差别。 Windows编程接口和类库
GDI和WPF • GDI是2维图形库,它允许程序员用库中的函数编写与显视器、打印机和文件等图形设备进行交互的Windows和Web应用程序,可以在这些设备上输出字符和2D图形。自Windows操作系统问世,GDI就是其固有的2维图形库。虽然随着Windows操作系统升级,GDI也不断改进并升级到GDI+,但远远跟不上硬件发展速度,现代显卡都有自己的GPU(图形处理器),GDI最大的缺点就是不能利用现代显卡的强大图形处理能力。 • 为此微软推出最新图形编程库WPF,是下一代显示系统。
和GDI相比WPF有如下优点: • 和DirectX采用相同技术,统一了微软各种图形类库。 • 引入了XAML界面标记语言,将界面设计和编写代码分开,方便设计。 • 支持2D和3D图形、动画、视频及音频回放。 • 可以和GDI模型互操作。 • 包括XML文件规范(XPS)文档、固定文档(WYSIWYG)、流文档和文档注释等多种文档处理模型。 • WPF控件使用增强型数据绑定引擎,支持多种内容到WPF控件的绑定。 • WPF控件使用矢量图形,自适应不同分辨率显示器。 • 支持多种布局管理器,WinForm只有很少几种。
WPF控件通用属性 WPF位于 System.Windows 命名空间。类库中大部分控件都在System.Windows.Controls命名空间, 以下是一些常用属性: • Name:控件名称,区别控件类不同对象的唯一标志。 • Text和Content: Text是字符串类型,TextBox和TextBlock控件只有Text属性,记录输入或显示的字符串。Content属性是Object类型,大部分控件只有Content属性, 。 • Foreground:用于描述前景色的画笔,例如Label是显示字符的颜色。 • Background:描述控件背景的画笔 • FontFamily、FontSize、FontStretch、FontStyle和FontWeight:分别是字符所使用的字体名称、字体的大小、字体在屏幕上的压缩或放大方式、字体风格和字体的粗细等。
Width、Height、ActualWidth和ActualHeight:控件的宽、高、实际宽和高。如果Margin属性的4个边距都不为0,实际宽、高可能和宽、高不同。Width、Height、ActualWidth和ActualHeight:控件的宽、高、实际宽和高。如果Margin属性的4个边距都不为0,实际宽、高可能和宽、高不同。 • Margin:控件距离其所在容器的左边、上边、右边和下边的距离。 • HorizontalAlignment:在水平方向子控件相对于容器左边还是右边对齐。 • VerticalAlignment:在垂直方向子控件相对于容器上边还是下边对齐。 • ToolTip:当鼠标在控件上停留一段时间后,会在旁边出现提示字符串。 • IsEnabled:布尔变量为true表示控件可使用,为false表示不可用,控件变灰色。 • Visibility:为Visible控件正常显示,为Hidden或Collapsed控件不可见。 • Cursor:鼠标移到控件上方时,鼠标显示的形状。
WPF程序基本结构 【例1】本例用C#代码创建一个最简单的WPF应用程序。 using System.Windows;//WPF应用程序必须引用的命名空间 using System.Windows.Controls;//WPF控件所在的命名空间 namespace e2_1 { class Window1 : Window //WPF窗口类,必须以Window类为基类 { [STAThread] static void Main() { Application ap=new Application(); //必须建立Application对象 ap.Run(new Window1()); } } }
【例2】本例用C#代码创建一个简单的WPF应用程序,在窗体中增加了一个按钮(Button)控件,并为单击按钮事件增加事件处理函数,单击按钮退出程序。【例2】本例用C#代码创建一个简单的WPF应用程序,在窗体中增加了一个按钮(Button)控件,并为单击按钮事件增加事件处理函数,单击按钮退出程序。 namespace e4_1 {class Window1 : Window {private Button button1 = new Button(); public Window1() {Title = "不使用VS创建的WPF程序"; WindowStartupLocation = WindowStartupLocation.CenterScreen; Height = 200; This.Width = 300; button1.Click += newRoutedEventHandler(button1_Clicked); button1.Height = 25;
button1.Width = 100; button1.Content = "退出程序"; AddChild(button1); Show(); } private void button1_Clicked(object sender, RoutedEventArgs e) { Application.Current.Shutdown(); } [STAThread] static void Main() { Application ap=new Application(); ap.Run(new Window1()); } } }
用VS2008创建WPF程序 【例2.4】本例在窗口中显示一行文字,增加3个按钮,单击标题为“红色”按钮,显示的文本颜色改为红色,单击标题为“黑色”的按钮,显示的文本颜色改为黑色,单击标题为“退出”按钮,关闭程序。实现步骤如下。 • (1)运行VS2008程序,单击菜单"文件(F)|新建项目(P)…"菜单项,打开"新建项目"对话框如图1.1。在"模板(T) "列表框中选择"WPF应用程序",在"名称(N) "编辑框中键入e2_4,单击"确定"按钮,创建项目。出现如图2.1界面(窗体无控件,左侧工具箱和右侧属性窗口未打开), 生成一个空白窗体(Window1)。单击菜单"文件(F)|全部保存(L)"菜单项,保存解决方案的所有文件。解决方案包括一个项目,解决方案的所有文件都保存到e2_4文件夹下。
(2)VS2008生成的WPF程序看不到Main(),其被隐藏到Application类中。由App.xaml和App.xaml.cs文件共同定义类App。图2.1上侧为Window1窗口,可以在其中放置控件,用Window1.xaml文件记录设计的界面,文件内容在图2.1下侧。Window1类是Window类的派生类,Window1类由Window1.xaml和Window1.xaml.cs文件定义,代码在Window1.xaml.cs文件中。 • (3)单击图2.1中标题为"Window1.xaml"的窗口标签,返回设计窗口。单击菜单"视图|属性窗口"菜单项打开属性窗口(见图2.1右侧)。选中Window1窗体,属性窗口显示Window1窗口属性,其中左侧为属性名称,右侧为属性值。Title属性值是窗口标题,修改Window1的Title属性值为"用VS2008创建WPF程序"。这是在设计阶段修改属性值。
(4)在图2.1下侧选中布局面板XAML标记<Grid>,它决定如何摆放面板中的所有控件,在属性窗口修改其属性Background="LightBlue"。还可在图2.1上侧用鼠标拖动的方法修改<Grid>布局面板、Windows窗体以及其他控件的大小,调整结果记录在Window1.xaml文件中。(4)在图2.1下侧选中布局面板XAML标记<Grid>,它决定如何摆放面板中的所有控件,在属性窗口修改其属性Background="LightBlue"。还可在图2.1上侧用鼠标拖动的方法修改<Grid>布局面板、Windows窗体以及其他控件的大小,调整结果记录在Window1.xaml文件中。 • (5)下边在窗体中增加一个Label控件,返回标题为"Window1.xaml"的窗口。向Window1窗体中添加控件需要使用工具箱窗口,若看不到,可用菜单"视图|工具箱"菜单项打开这个窗口(见图2.1左侧)。双击工具箱窗口中"控件"标签下的Label控件, Label控件将放到Window1窗体中,可以拖动Label控件到指定位置。选中Label控件,打开属性窗口(见图2.1右侧),属性窗口显示Label的属性,修改Label的Content属性值为"我的第一个程序",该属性值是显示内容。 • (6)用同样的方法在窗体中放三个Button控件到窗体,修改它们的属性Content,使标题分别为红色、黑色、退出。
(8)经过以上步骤,VS2008在Window1.xaml文件中增加了一些定义Label和3个Button控件的XAML标记,见图2.1下侧,这些XAML标记最终由编译器翻译为C#代码。(8)经过以上步骤,VS2008在Window1.xaml文件中增加了一些定义Label和3个Button控件的XAML标记,见图2.1下侧,这些XAML标记最终由编译器翻译为C#代码。 • (9)为按钮单击事件函数增加代码。事件函数如下。这些代码在Window1.xaml.cs文件中。注意大括号中语句为程序员增加的代码,其余是自动增加的代码。也可以使用Window类的Close()方法关闭窗口,由于关闭了主窗体,程序也就结束了。 private void button1_Click(object sender, RoutedEventArgs e) { label1.Foreground = Brushes.Red; } private void button2_Click(object sender, RoutedEventArgs e) { label1.Foreground=Brushes.Black; } private void button3_Click(object sender, RoutedEventArgs e) { Application.Current.Shutdown(); }
(10)编译运行(图2.3),单击标题为"红色"的按钮,窗体用户区中文字符颜色变为红色,单击标题为"黑色"的按钮,中文字符颜色变为黑色,单击标题为"退出"的按钮,结束程序。(10)编译运行(图2.3),单击标题为"红色"的按钮,窗体用户区中文字符颜色变为红色,单击标题为"黑色"的按钮,中文字符颜色变为黑色,单击标题为"退出"的按钮,结束程序。
XAML标记和类型转换器 XAML是一种基于XML的标记语言(参见10.1.3节),每一个XML元素代表.Net控件的一个对象,XML元素的属性可以是.Net控件属性或者声明控件事件的事件处理函数,从而用声明的方式在设计程序界面阶段实现应用程序外观,并将程序界面设计和代码分离,方便不同人员同时工作。 设计WPF程序界面一般有如下3种方法: • 在设计阶段将工具箱中控件放到图2.1上侧设计窗口,用事件窗口增加事件函数。 • 修改图2.1下侧XAML文件,增加控件、控件属性和事件函数,具有智能感知功能。 • 用代码增加控件、事件函数,修改控件属性。
各种WPF应用程序 • 1、传统WPF桌面应用程序 本章前边的例子都是传统意义的桌面应用程序。 • 2、基于浏览器导航的WPF独立应用程序 WPF新增了一种浏览器窗口风格桌面应用程序。这种风格应用程的窗口提供了导航功能,有前进和后退两个按钮,可以查看以前或后边已看过的内容。在Windows操作系统当中,当打开一个文件夹查看文件时的窗口就具有这样功能。
【例3】本例创建基于浏览器导航的WPF独立应用程序。首先创建传统WPF桌面应用程序。修改XAML标记如下,其中阴影标记是需要修改的部分。【例3】本例创建基于浏览器导航的WPF独立应用程序。首先创建传统WPF桌面应用程序。修改XAML标记如下,其中阴影标记是需要修改的部分。 <NavigationWindow 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"> <NavigationWindow.Content> <Grid> </Grid> </NavigationWindow.Content> </NavigationWindow>
修改Window1.xaml.cs文件中的Window1类的基类,定义如下:修改Window1.xaml.cs文件中的Window1类的基类,定义如下: public partial class Window1 : NavigationWindow{ … } • 其余不必修改。然后可以象传统WPF桌面应用程序那样在窗体放置控件,增加事件函数。
3、XAML 浏览器应用程序(XBAP) XAML 浏览器应用程序结合了 Web 应用程序和胖客户端应用程序二者的功能。与 Web 应用程序类似,可以将 XBAP 发布到 Web 服务器,并且从浏览器中启动。与胖客户端应用程序类似,XBAP 可以利用 WPF 的功能,开发 XBAP 也与胖客户端开发相似。当使用VS2008创建新项目打开"新建项目"对话框,如果选择"WPF浏览器应用程序"模板就可以创建XAML 浏览器应用程序。 编译后,生成可执行文件(.EXE扩展名)、应用程序清单和部署清单。将 .exe 和关联的清单复制到 Web 服务器上, 不需要在 Web 服务器上安装 .NET Framework3.5,在网页上创建一个超链接以导航到该部署清单。当用户单击链接并导航到.xbap文件时,ClickOnce将自动处理下载细节并在浏览器启动应用程序,要求在客户端必须安装.NET Framework3.5。
2.37 综合例子:计算器 【例4】本例创建一个能进行加、减、乘、除的简单计算器。 • (1)建立一个新项目。将Grid布局面板改为Canvas布局面板。 • (2)设置Window1窗体ResizeMode属性为NoResize。该属性设置用户能够如何调整窗体大小,NoResize表示用户无法调整窗口的大小,不显示最小化框和最大化框。 • (3)放TextBox控件到窗体,属性Text="0",IsReadOnly=true,TextAlignment=Right。 • (4)增加10个Button控件,前9个按钮属性Name分别为:Button1-Button9,最后一个为Button0,属性Content分别为:1、2、3、4、5、6、7、8、9、0。
(5)增加7个Button控件,属性Name分别为:btn_dot、btn_equ、btn_add、btn_sub、btn_mul、btn_div、btn_C,属性Content分别为:.、=、+、-、*、/、C。设计界面如图。(5)增加7个Button控件,属性Name分别为:btn_dot、btn_equ、btn_add、btn_sub、btn_mul、btn_div、btn_C,属性Content分别为:.、=、+、-、*、/、C。设计界面如图。
(6)按钮控件Button0单击事件函数如下: private void button0_Click(object sender, RoutedEventArgs e) { Button b1 = (Button)sender; if (textBox1.Text != "0") textBox1. Content += b1.Content; else textBox1.Text = b1.Content.ToString(); } • (7)按钮Button1-Button9的单击事件函数都设定为按钮Button0的单击事件函数。 • (8)为标题为"."按钮增加事件处理函数如下: private void btn_dot_Click(object sender, RoutedEventArgs e) { int n=textBox1.Text.IndexOf("."); if(n==-1) textBox1.Text=textBox1.Text+"."; } • (9)编译,运行,单击标题为"0"到"9"以及"."的按钮,在控件textBox1中可以看到输入的数字,也可以输入小数。
(10)先实现加法。为Window1类增加一个变量double sum = 0,记录部分和。 • (11)输入了第一个加数,然后输入任一运算符(+、-、*、\或=),在输入第二个加数前,应先清除编辑框中显示的第一个加数。为实现此功能,为Window1类增加一个布尔变量blnClear,初始值为false,表示输入数字或小数点前不清除编辑框中显示,输入运算符(+、-、*、\或=)后,blnClear=true,表示如果再输入数字或小数点,先清除编辑框中的显示的前一个加数。修改前边程序,输入数字或小数点前,要判断变量blnClear,如为true,清除编辑框中显示的内容后,再显示新输入的数字或小数点,同时修改blnClear=false。为此修改Button0单击事件处理函数如下: private void button0_Click(object sender, RoutedEventArgs e) { if(blnClear) {textBox1.Text="0"; blnClear=false;}
Button b1=(Button)sender; if(textBox1.Text!="0") textBox1.Text+= b1.Text; else textBox1.Text= b1.Text; } • (12)修改btn_dot_Click方法如下: private void btn_dot_Click(object sender, RoutedEventArgs e) { if(blnClear) {textBox1.Text="0"; blnClear=false; } int n=textBox1.Text.IndexOf("."); if(n==-1) textBox1.Text=textBox1.Text+"."; }
(13)如果要计算1+2-3,先单击标题为"1"的按钮,编辑框中显示1,再单击按钮+,执行运算sum=sum+1,显示sum到编辑框中,记住此次输入的运算符,这里为+号。单击按钮2,编辑框中显示2,再单击按钮-,按记录的运算符计算sum=sum+2,显示sum到编辑框中,记住此次输入的运算符,这里为-号,依此类推。为实现此功能,必须定义一个字符串变量strOper,记录输入的运算符,初始值为"+",保证输入第一个运算符后,执行运算sum=sum+第一个加数,由于初始sum=0,也就是sum=第一个加数。标题为"+"的按钮的单击事件处理函数: private void btn_add_Click(object sender, RoutedEventArgs e) { double dbSecond=Convert.ToDouble(textBox1.Text); if(!blnClear) switch(strOper) {case "+":sum+=dbSecond;break;} if(sender==btn_add) strOper="+"; textBox1.Text=Convert.ToString(sum); blnClear=true; }
(14)等号(=)处理语句和+号处理基本一致,修改标题为"+"按钮的事件函数如下:(14)等号(=)处理语句和+号处理基本一致,修改标题为"+"按钮的事件函数如下: private void btn_add_Click(object sender, RoutedEventArgs e) { double dbSecond=Convert.ToDouble(textBox1.Text); if(!blnClear) switch(strOper){case "+":sum+=dbSecond;break; } if(sender==btn_add) strOper="+"; if(sender==btn_equ) strOper="="; textBox1.Text=Convert.ToString(sum); blnClear=true; } 将标题为"="的按钮的单击事件处理函数设定为标题为"+"的按钮的单击处理事件函数。 • (15)为标题为"C"按钮增加事件处理函数如下: private void btn_C_Click(object sender, RoutedEventArgs e) { textBox1.Text="0"; sum=0; blnClear=false; strOper="+"; } • (16)请读者自己补上减法,乘法,除法运算的语句。