第7章 WPF应用程序入门_第1页
第7章 WPF应用程序入门_第2页
第7章 WPF应用程序入门_第3页
第7章 WPF应用程序入门_第4页
第7章 WPF应用程序入门_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

教育部普通高等教育十二五国家级规划教材

《C#程序设计教程》第3版

第7章WPF应用程序入门2Ch7WPF应用程序入门7.1WPF应用程序和XAML标记7.2窗口和对话框7.3颜色7.4形状7.5画笔7.6属性和事件37.1WPF应用程序和XAML标记WPF(WindowsPresentationFoundation,Windows呈现基础)是微软推出的基于DirectX和GPU加速来实现的图形界面显示技术。其优势在于界面呈现,主要用它来开发在客户端运行的桌面应用程序。WPF应用程序使用XAML来描述界面。WPF运行仍然从Main方法入口在App.xaml.cs文件中,可以查看隐藏的Main方法在App.xaml文件中,可以通过更改StartupUri属性的值改变起始窗体。7.1WPF应用程序和XAML标记App类App类是从Application类继承的类。通过App类,可以定义在整个应用程序范围内都可以使用的资源和公共属性。例如:Applicationcurrent=App.Current;App类常用的属性、方法和事件457.1WPF应用程序和XAML标记WPF应用程序的关闭模式调用Shutdown方法会立即关闭WPF应用程序。Shutdown方法的典型用法为App.Current.Shutdown();若要控制关闭模式,可以使用Shutdown方法的重载形式,使用ShutdownMode枚举指定应用程序的关闭模式。OnLastWindowCloseOnMainWindowCloseOnExplicitShutDown【例7-1】演示如何创建WPF应用程序67.1WPF应用程序和XAML标记XAML是一种基于XML的标记性语言,默认UTF-8编码。x:前缀编程构造xmlns特性声明XAML默认的命名空间;xmlns:x用于命名空间映射。一个XAML文件(扩展名为.xaml的文件)只能有一个根元素。x:Class用于为代码隐藏类指定CLR命名空间和类名;Name特性指定对象的名称属性。<ButtonContent="Button"Name="button1"Width="75"/>X:Name特性为运行时(C#代码引用XAML元素)使用的XAML元素提供标识。<ButtonX:Name="button1"Content="Button"Width="75"/>7.1WPF应用程序和XAML标记在XAML中映射自定义命名空间若在XAML中引用自定义对象,就必须在XAML中映射自定义命名空间。例如:第一步:定义公共类MyClass(假设在命名空间Ch07.cs下)第二步:在TestWindow.xaml中引用MyClass时,需要在根元素中为其指定XAML命名空间。<window…xmlns:c=“clr-namespace:ch07.cs”…>其中c为自定义前缀,也可以换成其他字符串31一月20237在XAML中映射自定义命名空间31一月202387.1WPF应用程序和XAML标记XAML基本语法XAML的语法与HTML的语法非常相似,即都是利用元素、特性(Attribute)和属性(Property)来描述元素对象的各种要素XAML最基本的语法为:<对象名

特性名1="值1"特性名2="值2"……></对象名>或者:<对象名

特性名1=“值1”特性名2=“值2”……/>XAML中的对象元素名称、特性名称以及属性名称都区分大小写。9107.1WPF应用程序和XAML标记XAML基本语法对象元素语法对象是指类的实例,在XAML中用对象元素来描述。例如:<ButtonName="OkButton"Content="确定"/>特性语法用特性(Attribute)来描述对象的属性(Property),特性名和特性值之间用=分隔,特性的值始终用包含在引号中的字符串来指定,引号默认用双引号,也可以是单引号,原则是“值”两边的引号必须匹配。例如:<ButtonBackground="Blue"Foreground="Red"Content="按钮1"/>特性语法还可用于描述事件成员。例如:<ButtonClick="Button_Click">ClickMe!</Button>117.1WPF应用程序和XAML标记XAML基本语法属性语法:仅仅用特性语法无法来描述对象的某些属性,可以使用属性语法。一般格式为:<类名.属性名></类名.属性名>例如:<ButtonBackground="Blue"Foreground="Red"Content="右击观察快捷菜单"Margin="73,108,74,115"><Button.ContextMenu><ContextMenu><MenuItem>快捷菜单项1</MenuItem><MenuItem>快捷菜单项2</MenuItem></ContextMenu></Button.ContextMenu></Button>127.1WPF应用程序和XAML标记XAML基本语法集合语法如果某个属性采用集合类型,可以使用集合语法。例如:<Window.Background><LinearGradientBrush><LinearGradientBrush.GradientStops><GradientStopOffset="0.0"Color="Red"/><GradientStopOffset="1.0"Color="Blue"/></LinearGradientBrush.GradientStops></LinearGradientBrush></Window.Background>XAML内容属性

内容属性的用途是为了简化标记,以便更直观地嵌套父/子元素。例如: <TextBox>ThisisaTextBox</TextBox>相当于: <TextBoxText="ThisisaTextBox"/>137.1WPF应用程序和XAML标记XAML基本语法内容属性和集合语法组合<StackPanel><Button>按钮1</Button><Button>按钮2</Button></StackPanel>类型转换器将用字符串进行设置的特性值转换为其他对象类型或基元值。例如:<ButtonMargin="10,20,30,40"Content="确定"/>相当于:<ButtonContent="确定"><Button.Margin><ThicknessLeft="10"Top="20"Right="30"Bottom="40"/></Button.Margin></Button>147.1WPF应用程序和XAML标记XAML基本语法XAML中的空白处理XAML中的空白字符包括空格、换行符和制表符。默认情况下,XAML处理器会将所有空白字符(空格、换行符和制表符)自动转换为空格。另外,处理XAML时连续的空格将被替换为一个空格。如果希望保留文本字符串中的空格,可以在该元素的开始标记内添加xml:space="preserve"特性。但是,要避免在根级别指定该特性,否则会影响XAML处理的性能。

157.2窗口和对话框

WPF窗口窗口的类型:WPF窗口(窗口)和WPF导航窗口(WPF页)窗口分类WPF窗口由非工作区和工作区两部分构成,非工作区主要包括图标、标题、系统菜单、按钮和边框。标准窗口:包含工作区和非工作区的窗口无边框窗口:只有工作区部分浮动窗口:非工作区的右上角只有关闭按钮,不包括最小化、最大化和还原按钮工具窗口:比浮动窗口多了一个“铆钉”按钮。167.2窗口和对话框

创建并显示新窗口在C#代码中调用Show方法或者ShowDialog方法显示窗体。无模式窗口:调用Show方法,窗体显示后会立即执行该方法后面的语句,打开的窗口不会阻止用户与应用程序中的其他窗口交互。模式窗口:调用ShowDialog方法,在该窗口关闭之前,应用程序中的所有其他窗口都会被禁用,仅在该窗口关闭后,才继续执行ShowDialog方法后面的代码。对于“无模式”窗口,调用Hide方法即可将其隐藏起来。177.2窗口和对话框

关闭窗口在C#代码中,直接调用Close方法即可关闭当前打开的窗口当窗口关闭时,会引发两个事件:Closing事件和Closed事件。窗口关联通过设置附属窗口的Owner属性让一个窗口拥有另一个窗口。例如:WindowownedWindow=newWindow();ownedWindow.Owner=this;ownedWindow.Show();

通过这种方式建立关联之后,附属窗口就可以通过Owner属性的值来引用它的所有者窗口,所有者窗口也可以通过OwnedWindows属性的值来发现它拥有的全部窗口。187.2窗口和对话框

在主窗口显示前先显示登录窗口或者欢迎窗口在主窗口显示前先显示另一个窗口,比如登录窗口或者欢迎窗口,当用户关闭登录窗口或者欢迎窗口后再显示主窗口,要达到这个目的,可以通过主窗口的SourceInitialized事件来实现。【例7-2】演示如何在主窗口显示前先显示登录窗口,同时演示窗口的基本用法。197.2窗口和对话框

窗口的外观和行为窗口大小窗口大小由Width、MinWidth、MaxWidth、Height、MinHeight、MaxHeight以及SizeToContent等多个属性确定。窗口位置通过Left和Top属性获取或更改窗口相对于屏幕坐标的x和y位置。WindowStartupLocation属性设置窗口第一次显示时的初始位置,枚举值有:Manual(默认)、CenterScreen、CenterOwner。207.2窗口和对话框

窗口顺序表示从屏幕内向外方向显示顺序的位置,称为z顺序。有两种z顺序:正常z顺序和最顶层z顺序。在最顶层z顺序中的窗口总是位于正常z顺序中的窗口之上。通过将窗口的Topmost属性设置为true可以使窗口位于最顶层z顺序中。217.2窗口和对话框

对话框消息框调用MessageBox类的静态Show方法来显示消息框。MessageBox类的静态Show方法提供了多种重载形式,常用的重载形式有:publicstaticMessageBoxResultShow(stringtext)publicstaticMessageBoxResultShow(stringtext,stringcaption)publicstaticMessageBoxResultShow(stringtext,stringcaption,MessageBoxButtonbuttons,MessageBoxImageicon)227.2窗口和对话框

【例7-3】演示如何在WPF应用程序中弹出消息框以及获取消息框返回的值。237.2窗口和对话框

通用对话框OpenFileDialog对话框:用户选择一个或多个要打开的文件的文件名。SaveFileDialog对话框:用户选择一个要将文件另存为的文件名。PrintDialog对话框:用户选择和配置打印机并打印文档。247.2窗口和对话框WPF页和页面导航1、在WPF窗口中承载Page用C#代码将WPF窗口的Content属性设置为页的实例来承载WPF页,即将Window作为页的宿主窗口。例如:Windoww=newWindow();Page1p=newPage1();w.Content=p;w.Show();这种方式只能用C#代码实现,而且承载的页没有导航功能,页中的超链接也不会起作用,因此在实际应用中很少这样用。257.2窗口和对话框

WPF页和页面导航2、在NavigationWindow中承载Page用C#代码将NavigationWindow窗口的Content属性设置为页的实例来承载WPF页,即将NavigationWindow作为页的宿主窗口。

例如:Windoww=newSystem.Windows.Navigation.NavigationWindow();w.Content=newPageExamples.Page1();w.Show();采用这种方式时,可以在页中设置导航窗口(NavigationWindow)的标题以及窗口大小。也可以在C#代码中使用NavigationService类提供的静态方法实现导航功能。267.2窗口和对话框

WPF页和页面导航2、在NavigationWindow中承载PagePage的常用属性如下。WindowTitle:设置导航窗口的标题。WindowWidth和WindowHeight:设置导航窗口的宽度和高度。ShowsNavigationUI:false表示不显示导航条,true表示显示导航条。NavigationService属性:获取该页的宿主窗口中管理导航服务的对象,利用该对象可实现前进、后退、清除导航记录等操作。使用举例:ReportPageexpenseReportPage=newReportPage();this.NavigationService.Navigate(expenseReportPage);277.2窗口和对话框

WPF页和页面导航3、在Frame中承载Page在Frame元素中将Source属性设置为导航到的页,在这种方式下,既可以用XAML加载页并实现导航,也可以用C#代码来实现。例如:XAML:<FrameName="frame1"NavigationUIVisibility="Visible"Source="Page1.xaml"Background="#FFF9F4D4"/>C#:frame1.Source=newUri("Page1.xaml",UriKind.Relative);287.3颜色和形状WPF在System.Windows.dll中的System.Windows.Media命名空间下,分别提供了Brushes类、Colors类和Color结构,这几种形式都可以用来表示颜色。

Brushs类和Colors类在System.Windows.dll中的System.Windows.Media命名空间下的Brushes类和Colors类都利用静态属性提供了预定义的颜色,这些颜色在各种应用程序中都可以使用。如设置控件的前景色、背景色、边框色等。Brushes类的C#语法为publicsealedclassBrushesColors类的C#语法为publicsealedclassColors297.3颜色和形状

Color结构WPF在System.Windows.Media命名空间下提供了一个Color结构,该结构通过A(透明度)、R(红色通道)、G(绿色通道)和B(蓝色通道)的组合来创建各种自定义的颜色。一般形式为“#rrggbb”或者“#aarrggbb”,其中#表示十六进制,aa表示透明度,rr表示红色通道,gg表示绿色通道,bb表示蓝色通道。常用方法:Color.FromArgb(intred,intgreen,intblue);307.3颜色和形状

形状(Shape)是具有界面交互功能的几何图形的封装形式。System.Windows.Shapes命名空间定义了呈现2D几何图形对象的类,这些类都继承自同一个Shape类。形状控件共有的属性形状控件共有的属性都是在Shape类中定义的。由于所有形状都是从Shape类继承的,所以形状控件都可以使用这些属性。属性说明Stroke获取或设置指定形状轮廓绘制方式的BrushStrokeThickness获取或设置指定形状轮廓的宽度Fill获取或设置指定形状内部填充方式的BrushStretch用枚举值说明如何填充形状的内部。可选的枚举值有:None:不拉伸。内容保持原始大小Fill(默认值):调整内容的大小以填充目标尺寸,不保留纵横比Uniform:在保留内容原有纵横比的同时调整内容的大小至目标尺寸UniformToFill:在保留内容原有纵横比的同时调整内容的大小,并填充至目标尺寸。如果目标矩形的纵横比不同于源矩形的纵横比,则对源内容进行剪裁以适合目标尺寸317.3颜色和形状

矩形(Rectangle)形状控件共有的属性都是在Shape类中定义的。由于所有形状都是从Shape类继承的,所以形状控件都可以使用这些属性。Rectangle类用于绘制矩形。例如:<Canvas><RectangleWidth="100"Height="100"Fill="Blue"Stroke="Red"Canvas.Top="20"Canvas.Left="20"StrokeThickness="3"/></Canvas>【例7-6】演示矩形控件的基本用法。327.3颜色和形状椭圆(Ellipse)Ellipse类用于绘制椭圆,当Width和Height相等时,绘制的实际上是一个圆。例如:<CanvasBackground="LightGray"><EllipseHeight="75"Width="75"Fill="#FFFFFF00"StrokeThickness="5"Stroke="#FF0000FF"/></Canvas>这段XAML代码在设计界面中看到的效果如下图所示。31一月2023337.3颜色和形状

其他基本形状(可以自学)Line(直线)<LineX1="10"Y1="10"X2="50"Y2="50"Stroke="Black"StrokeThickness="4"/>PolyLine(多条依次相连的直线)PolyLine用于用于定义多个点,然后将这些点依次用直线相连,从而构成各种折线形状。例如:<Canvas><PolylinePoints="50,250,100100,10050,25"Stroke="Blue"StrokeThickness="10"Canvas.Left="75"Canvas.Top="50"/></Canvas>

31一月2023347.3颜色和形状Polygon(多边形)该控件和PolyLine用法相似,但它会自动将最后1个点和第1个点连起来。例如:<Canvas><PolygonPoints="300,200400,125400,275"Stroke="Purple"StrokeThickness="2"><Polygon.Fill><SolidColorBrushColor="Blue"Opacity="0.4"/></Polygon.Fill></Polygon></Canvas>

357.4画笔(Brush)

在WPF应用程序中,画笔(Brush)是所有控件都具有的基本功能。最常见的是利用画笔设置控件的前景色、背景色,填充渐变色、图像和图案。画笔分类

画笔的所有类型都在System.Windows.Media命名空间下,Brush类是各种画笔的抽象基类,其他画笔类型都是从该类继承。画笔分类说明纯色画笔同SolidColorBrush实现,通过Color属性设置画笔颜色渐变画笔包括:LinearGradientBrush:线性渐变画笔。填充的区域从一种颜色逐渐过渡到另一种颜色RadialGradientBrush:径向渐变画笔,也叫仿射渐变画笔。填充的区域颜色以椭圆为边界,从原点开始由内向外逐步扩散平铺画笔基类为TitleBrush,扩充类包括:ImageBrush:图像画笔。用图像填充一个区域DrawingBrush:使用GeometryDrawing、ImageDrawing或VideoDrawing填充一个区域VisualBrush:使用DrawingVisual、Viewport3DVisual或ContainerVisual填充一个区域VideoBrush:用视频填充一个区域画笔资源将画笔作为XAML资源来处理367.4画笔(Brush)

利用WPF设计器和属性窗口设置画笔类型在XAML或者文档大纲中选中某个控件后,可直接利用【属性】窗口设置画笔类型。

纯色画笔渐变画笔平铺画笔377.4画笔(Brush)

纯色画笔(SolidColorBrush)创建SolidColorBrush实例后,可通过Color类提供的方法设置Color属性。例如SolidColorBrushscb=newSolidColorBrush();scb.Color=Color.FromArgb(0xFF,0xFF,0x0,0x0);button1.Background=scb;线性渐变画笔(LinearGradientBrush)

LinearGradientBrush使用沿一条直线(即渐变轴)定义的渐变绘制区域。可以使用GradientStop对象指定渐变的颜色及其在渐变轴上的位置,还可以修改渐变轴创建水平和垂直渐变并反转渐变方向。如果不指定渐变方向,LinearGradientBrush默认创建对角线渐变。

387.4画笔(Brush)

线性渐变画笔(LinearGradientBrush)

<StackPanel><!--对角线渐变--><RectangleWidth="200"Height="100"><Rectangle.Fill><LinearGradientBrushStartPoint="0,0"EndPoint="1,1"><GradientStopColor="Yellow"Offset="0.0"/><GradientStopColor="Red"Offset="0.25"/><GradientStopColor="Blue"Offset="0.75"/><GradientStopColor="LimeGreen"Offset="1.0"/></LinearGradientBrush></Rectangle.Fill></Rectangle></StackPanel>

397.4画笔(Brush)

线性渐变画笔(LinearGradientBrush)

通过修改画笔的StartPoint和EndPoint创建水平和垂直渐变效果

407.4画笔(Brush)径向渐变画笔(RadialGradientBrush)以一个椭圆为边界,从中心点开始由内向外逐渐填充渐变的颜色。画笔由原点(GradientOrigin)和辐射到的范围(Center、RadiusX、RadiusY)来定义。渐变从原点(GradientOrigin)开始由强到弱逐渐向外围辐射,中心点和半径(Center、RadiusX、RadiusY)指定辐射到的椭圆范围,Center属性指定椭圆的圆心。渐变轴上的渐变停止点指定辐射的颜色和偏移量。例如:<StackPanel><RectangleWidth="200"Height="100"><Rectangle.Fill><RadialGradientBrushGradientOrigin="0.5,0.5"Center="0.5,0.5"RadiusX="0.5"RadiusY="0.5"><GradientStopColor="Yellow"Offset="0"/><GradientStopColor="Red"Offset="0.25"/><GradientStopColor="Blue"Offset="0.75"/><GradientStopColor="LimeGreen"Offset="1"/></RadialGradientBrush></Rectangle.Fill></Rectangle></StackPanel>

417.4画笔(Brush)

利用WPF设计器实现画笔变换在WPF设计器中,可直接用鼠标对各种控件进行平移(Translate)、旋转(Rotate)、缩放(Scale)、扭曲(Skew)、反转(Flip)等变换

427.5属性依赖项属性和附加属性属性(Property)是类对外公开的字段,用get和set访问器实现。简称CLR属性。依赖项属性

为了用XAML描述动态变化的属性值以及用XAML实现数据绑定,每个控件又用DependencyProperty类对CLR属性做了进一步的封装和扩展,这些与CLR属性对应的封装和扩展后的属性称为依赖项属性。主要用于样式、主题、数据绑定、动画、元数据重写、属性值继承以及WPF设计器集成等情况。

437.5属性依赖项属性

控件的每个CLR属性都有与其对应的依赖项属性,反之亦然。在XAML以及【属性】窗口中,都是用依赖项属性来描述控件的某个属性,此时WPF会自动维护与该依赖项属性对应的CLR属性。在C#代码中,开发人员绝大部分情况下都是使用CLR属性获取或修改控件的某个属性值,此时系统会自动处理与该CLR属性对应的依赖项属性。只有在实现动画等特殊功能时,才需要设置系统无法判断该如何处理的依赖项属性的相关信息。

447.5属性依赖项属性和附加属性附加属性可以在某个子元素上指定其父元素的属性,以这种方式声明的属性称为附加属性。定义附加属性的一般形式为:父元素类型名.属性名例如:<DockPanel><CheckBoxDockPanel.Dock="Top">Hello</CheckBox></DockPanel><Canvas><RectangleWidth="100"Height="100"Fill="Blue"Stroke="Red"

Canvas.Top="20"Canvas.Left="20"StrokeThickness="3"/></Canvas>

457.6事件WPF事件模型事件是指由系统事先设定的、能被控件识别和响应的动作,如单击鼠标、按下某个键等。在XAML中注册事件在XAML中,声明事件的一般形式为事件名="事件处理程序名"或者:子元素类型名.事件名="事件处理程序名"

既可以通过事件列表附加事件。例如:<ButtonName="Button1"MouseDoubleClick="Button1_MouseDoubleClick_1"/>也可以在XAML中直接键入事件名称。

467.6事件在C#代码中注册事件利用+=注册事件,利用-=取消注册,例如:publicMainWindow(){InitializeComponent();Button1.MouseDoubleClick+=Button1_MouseDoubleClick;}voidButton1_MouseDoubleClick(objectsender,MouseButtonEventArgse){//事件处理代码}

477.6事件WPF事件模型事件处理程序中的参数所有WPF事件处理程序默认都提供两个参数。例如:privatevoidOkButton_Click_1(objectsender,RoutedEventArgse)

参数sender报告附加该事件的对象,参数e是数据源的相关数据。在WPF应用程序中,绝大部分情况下都是用e.Source来判断事件源是谁。另外,如果是判断图形图像中重叠的部分,则应该用e.OriginalSource靠命中测试来判断。事件使用要点(1)大部分情况下通过【属性】窗口直接设置某元素的事件(2)如果具有相同类型的元素很多,而且这些元素都会引发某个相同的事件,此时可以在其父元素中声明附加事件,这种办法可以简化事件声明的次数。

487.6事件事件路由策略:WPF中的事件路由使用直接、冒泡和隧道三种方式。直接路由直接(Direct)是指该事件只针对元素自身,而不会再去路由到其他元素。冒泡冒泡(Bubble)是指从事件源依次向父元素方向查找,直到查找到根元素为止。目的是搜索父元素中是否包含针对该元素的附件事件声明。利用内部“冒泡”处理这个原理,我们就可以在某个父元素上一次性地为多个子元素注册同一个事件。例如:

<BorderBorderBrush="Gray"BorderThickness="1"Margin="154,233,201,109"><StackPanelBackground="LightGray"Orientation="Horizontal"Button.Click="Button_Click"Margin="3,33,-3,65"><ButtonName="YesButton"Content="是"Width="54"/><ButtonName="NoButton"Content="否"Width="65"/>

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论