1 / 28

WPF 编程基础

WPF 编程基础. API(Application Programming Interface) 是 Windows 操作系统编写 Windows 应用程序函数库,库中函数采用 C 语言调用格式。用 C 语言直接调用 API 函数也可以编制 Windows 应用程序,但大量的代码必须由程序员自己编写,给编程者带来很大的困难。

sugar
Download Presentation

WPF 编程基础

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. WPF编程基础

  2. API(Application Programming Interface)是Windows操作系统编写Windows应用程序函数库,库中函数采用C语言调用格式。用C语言直接调用API函数也可以编制Windows应用程序,但大量的代码必须由程序员自己编写,给编程者带来很大的困难。 .Net FrameWork中包括编写Windows应用程序、Web应用程序的基础类库(BCL),它是一个统一的、面向对象的、层次化的、可扩展类库,统一了微软当前各种不同框架和开发模式,无论开发Windows应用程序,还是开发Web应用程序,采用相同组件名称,组件具有类似属性、方法和事件,开发模式也相似,方便学习。该类库支持控件可视化编程。VC++.Net、VB.Net、C#语言都使用这个类库,消除了各种语言开发模式的差别。 Windows编程接口和类库

  3. GDI和WPF • GDI是2维图形库,它允许程序员用库中的函数编写与显视器、打印机和文件等图形设备进行交互的Windows和Web应用程序,可以在这些设备上输出字符和2D图形。自Windows操作系统问世,GDI就是其固有的2维图形库。虽然随着Windows操作系统升级,GDI也不断改进并升级到GDI+,但远远跟不上硬件发展速度,现代显卡都有自己的GPU(图形处理器),GDI最大的缺点就是不能利用现代显卡的强大图形处理能力。 • 为此微软推出最新图形编程库WPF,是下一代显示系统。

  4. 和GDI相比WPF有如下优点: • 和DirectX采用相同技术,统一了微软各种图形类库。 • 引入了XAML界面标记语言,将界面设计和编写代码分开,方便设计。 • 支持2D和3D图形、动画、视频及音频回放。 • 可以和GDI模型互操作。 • 包括XML文件规范(XPS)文档、固定文档(WYSIWYG)、流文档和文档注释等多种文档处理模型。 • WPF控件使用增强型数据绑定引擎,支持多种内容到WPF控件的绑定。 • WPF控件使用矢量图形,自适应不同分辨率显示器。 • 支持多种布局管理器,WinForm只有很少几种。

  5. 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:分别是字符所使用的字体名称、字体的大小、字体在屏幕上的压缩或放大方式、字体风格和字体的粗细等。

  6. 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:鼠标移到控件上方时,鼠标显示的形状。

  7. 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()); } } }

  8. 【例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;

  9. 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()); } } }

  10. 用VS2008创建WPF程序 【例2.4】本例在窗口中显示一行文字,增加3个按钮,单击标题为“红色”按钮,显示的文本颜色改为红色,单击标题为“黑色”的按钮,显示的文本颜色改为黑色,单击标题为“退出”按钮,关闭程序。实现步骤如下。 • (1)运行VS2008程序,单击菜单"文件(F)|新建项目(P)…"菜单项,打开"新建项目"对话框如图1.1。在"模板(T) "列表框中选择"WPF应用程序",在"名称(N) "编辑框中键入e2_4,单击"确定"按钮,创建项目。出现如图2.1界面(窗体无控件,左侧工具箱和右侧属性窗口未打开), 生成一个空白窗体(Window1)。单击菜单"文件(F)|全部保存(L)"菜单项,保存解决方案的所有文件。解决方案包括一个项目,解决方案的所有文件都保存到e2_4文件夹下。

  11. (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程序"。这是在设计阶段修改属性值。

  12. (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,使标题分别为红色、黑色、退出。

  13. (7)现在为标题为"红色"的按钮增加单击事件函数。在标题为"Window1.xaml"的窗口中,选中标题为"红色"的按钮,单击属性窗体上边左数第4个图标,打开事件窗口(图2.2),显示Button控件所能响应的所有事件,其中左侧为事件名称,右侧为事件处理函数名称,如果右侧为空白,表示还没有指定事件处理函数,选中Click事件,双击右侧空白处,增加标题为"红色"的按钮的单击事件处理函数。用同样方法为另两个按钮增加事件处理函数。

  14. (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(); }

  15. (10)编译运行(图2.3),单击标题为"红色"的按钮,窗体用户区中文字符颜色变为红色,单击标题为"黑色"的按钮,中文字符颜色变为黑色,单击标题为"退出"的按钮,结束程序。(10)编译运行(图2.3),单击标题为"红色"的按钮,窗体用户区中文字符颜色变为红色,单击标题为"黑色"的按钮,中文字符颜色变为黑色,单击标题为"退出"的按钮,结束程序。

  16. XAML标记和类型转换器 XAML是一种基于XML的标记语言(参见10.1.3节),每一个XML元素代表.Net控件的一个对象,XML元素的属性可以是.Net控件属性或者声明控件事件的事件处理函数,从而用声明的方式在设计程序界面阶段实现应用程序外观,并将程序界面设计和代码分离,方便不同人员同时工作。 设计WPF程序界面一般有如下3种方法: • 在设计阶段将工具箱中控件放到图2.1上侧设计窗口,用事件窗口增加事件函数。 • 修改图2.1下侧XAML文件,增加控件、控件属性和事件函数,具有智能感知功能。 • 用代码增加控件、事件函数,修改控件属性。

  17. 各种WPF应用程序 • 1、传统WPF桌面应用程序 本章前边的例子都是传统意义的桌面应用程序。 • 2、基于浏览器导航的WPF独立应用程序 WPF新增了一种浏览器窗口风格桌面应用程序。这种风格应用程的窗口提供了导航功能,有前进和后退两个按钮,可以查看以前或后边已看过的内容。在Windows操作系统当中,当打开一个文件夹查看文件时的窗口就具有这样功能。

  18. 【例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>

  19. 修改Window1.xaml.cs文件中的Window1类的基类,定义如下:修改Window1.xaml.cs文件中的Window1类的基类,定义如下: public partial class Window1 : NavigationWindow{ … } • 其余不必修改。然后可以象传统WPF桌面应用程序那样在窗体放置控件,增加事件函数。

  20. 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。

  21. 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。

  22. (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。设计界面如图。

  23. (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中可以看到输入的数字,也可以输入小数。

  24. (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;}

  25. 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+"."; }

  26. (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; }

  27. (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)请读者自己补上减法,乘法,除法运算的语句。

More Related