2024年1月5日发(作者:)
WPF揭秘--唐彦2011-03-07目录什么是WPF?....................................................................................................................................2WPF的特点........................................................................................................................................2WPF与Silverlight的渊源..................................................................................................................2WPF的类结构....................................................................................................................................3XAML标记语言..................................................................................................................................4WPF布局............................................................................................................................................6栈面板(StackPanel)...............................................................................................................6环绕面板(WrapPanel)...........................................................................................................6停靠面板(DockPanel)............................................................................................................7网格面板(Grid)......................................................................................................................8均布网格(UniformGrid)........................................................................................................9画布(Canvas).........................................................................................................................9视图框(ViewBox).................................................................................................................10公共布局属性...........................................................................................................................10WPF数据绑定控件...........................................................................................................................14WPF动画..........................................................................................................................................15WPF与windows7开发多点触控程序...........................................................................................17WPF3D应用.....................................................................................................................................21代码实例演示...................................................................................................................................22小结...................................................................................................................................................22
什么是WPF?WindowsPresentationFoundation(WPF以前的代号为“Avalon”)是下一代显示系统,用于生成能带给用户震撼视觉体验的Windows客户端应用程序,国人称之为“我佩服”。使用WPF,可以创建广泛的独立应用程序以及浏览器承载的应用程序。WPF的核心是一个与分辨率无关并且基于矢量的呈现引擎,旨在利用现代图形硬件的优势。WPF通过一整套应用程序开发功能扩展了这个核心,这些功能包括可扩展应用程序标记语言(XAML)、控件、数据绑定、布局、二维和三维图形、动画、样式、模板、文档、媒体、文本和版式。WPF的特点1、WPF所有的操作都不依赖于GDI和GDI+,而是间接依赖于强大的Direct3D,这就意味着通过WPF可以做出以前WinFrom无法想象的视觉效果,包括3D效果的应用程序。目前最新的显卡已经支持DirectX11,绚丽的逼真3D效果通过WPF实现也是非常简单的事情。2、WPF实现彻底把程序架构,业务逻辑和用户界面(UI)彻底分开,WPF引擎把XAML描述的UI元素解释为相应的.NET对象,从而在应用程序创建相应的控件,UI人员和程序人员均可对此控件进行编辑加载,从而实现用户界面和程序架构的彻底分离,而Winform这一点是做不到的。设计人员需要用到的工具:MicrosoftExpressionBlend3WPF与Silverlight的渊源Silverlight(旧称WindowsPresentationFoundation/Everywhere,即WPF/E),有中文译为银光,是微软跨浏览器、跨平台的RIAweb解决方案。Silverlight在API层可以看成是WPF的子集,但事实上除了这点之外,Silverlight与WPF有着较大区
别。Silverlight应用程序不依赖于.NETFramework,只要用户计算机(或手机)安装有Silverlight运行环境(比如用户通过互联网给浏览器添加了Silverlight插件),就可以跑Silverlight应用程序,并不要求用户安装.NETFramework。Silverlight运行时环境在API层面也可以看成是标准.NETFramework的功能子集,但它完全是重新写过的,独立于标准的.NETFramework,虽然为了方便应用程序开发,微软努力保持两者在API层面的一致性,但并不排除Silverlight运行时环境日后会拥有全新的为.NET标准环境所不具备的功能。WPF主要用于开发桌面应用程序,Silverlight主要战场是互联网,通常用它来开发RIA的互联网应用程序(富互联网应用程序),或者是跑在手机等智能移动设备上的应用程序。WPF的类结构WPF的核心名称空间从s开始(如s、ls以及)。唯一的例外是由开始的名称空间,它是Windows窗体工具包的一部分。cherObject类WPF应用程序使用非常熟悉的单线程亲和(single-threadaffinity,STA)模型,这意味着整个用户界
面由一个单独的线程拥有。从另一个线程与用户界面元素进行交互是不安全的。为了能够更加容易地使用此模型,每个WPF应用程序由一个协调消息(从键盘输入、鼠标移动到框架处理,如布局)的调度程序(dispatcher)管理。通过继承自DispatcherObject类,用户界面中的每个元素都可以检查代码是否在正确的线程上运行,并且可以访问调度程序为用户界面线程安排代码。encyObject类在WPF中,和屏幕上的元素进行交互的主要方式是通过属性。通过继承自DependencyObject类,WPF类可以获得对依赖项属性的支持。类在WPF应用程序中显示的每个元素,在本质上都是一个Visual对象。可以将Visual类看作是一个图形对象,它封装了绘图指令、如何执行绘图的额外细节(如剪裁、透明度以及变换设置),以及基本功能(如命中测试)。Visual类还在托管的WPF库和渲染桌面的程序集之间提供了链接。任何继承自Visual的类的对象都可以在窗口上被显示出来。ent类UIElement类为WPF的本质特征提供支持,如布局、输入、焦点以及事件。orkElement类FrameworkElement类是WPF核心继承树中的最后一站。该类实现了一些由UIElement类定义的成员(在UIElement类中只是定义了这些成员而没有实现)。例如,UIElement类为WPF布局系统设置变换,但是FrameworkElement类提供了支持变换的关键属性(如HorizontalAlignment属性和Margin属性)。UIElement类还为数据绑定、动画以及样式提供支持,这些都是核心特征。类基本的形状类(如Rectangle类、Polygon类、Ellipse类、Line类以及Path类)都继承自该类。这些形状类可以和更传统的Windows装饰控件一起使用,如按钮和文本框。l类控件(control)就是可以和用户交互的元素。控件显然包括TextBox控件、Button控件以及ListBox控件。Control类为设置字体和前景色与背景色提供了附加支持。但是令人更感兴趣的细节是模板支持,模板支持使用自定义风格的绘图替换控件的标准外观。注意:在Windows窗体编程中,窗体中的所有可视化内容都被称为控件。在WPF中,不再如此。可视化内容被称为元素(element)。使这一概念更加令人混淆的是,许多元素在ls名称空间中定义,尽管它们不是继承自l类,并且不被认为是控件。Panel类就是其中的一个例子。tControl类ContentControl类是所有具有单一内容控件的基类。包括从简单的标签到窗口的所有内容。ontrol类ItemsControl类是所有显示选项集合的控件的基类,如ListBox控件和TreeView控件。类Panel类是所有布局容器的基类,布局容器是可以包含一个或多个子元素,并根据指定的规则对子元素进行排列的元素。这些容器是WPF布局系统的基础,并且使用它们可能是以最富有吸引力、最灵活的方式安排内容的关键。XAML标记语言XAML是eXtensibleApplicationMarkupLanguage的英文缩写,相应的中文名称为可扩展应用程序
标记语言,它是微软为构建应用程序用户界面而创建的一种新的描述性语言。XAML提供了一种便于扩展和定位的语法来定义和程序逻辑分离的用户界面,而这种实现方式和中的"代码后置"模型非常类似。XAML是一种解析性的语言,尽管它也可以被编译。它的优点是简化编程式上的用户创建过程,应用时要添加代码等。XAML仅仅是创建和初始化对象的另一种途径。你完全可以不使用XAML来实现WPF应用。在XAML中申明还是在代码里编写完全取决于自己的想法。不过在XAML来申明用户界面有下列一些好处:1、XAML代码比较简单、清晰、易读2、分离的逻辑代码和设计代码3、图形设计工具如expressionblend都创建的是XAML文件4、XAML中逻辑和设计的分离也表示了设计者和开发者角色的独立XAML示例:
扩展标签扩展标签是指在XAML中属性值的动态占位符。它解决了在运行时为属性赋值。扩展标签通常被包含在一组大括号,例如:Background=”{StaticResourceNormalBackgroundBrush}"。WPF有一些内置的扩展标签:Binging---将两个属性的值绑定在一起StaticResource---一次性匹配资源项DynamicResource---动态的匹配资源项TemplateBinding---将属性的模板控制绑定到属性所依赖的控件上x:Static---设定静态属性的值x:NULL---返回空(null)在大括号内的第一个标记是扩展标签的名称。所有后面的都是以属性=值形式的命名参数。下面的例子展示了一个Label,他的内容(Content)被绑定为一个文本框(TestBox)的文本(Text)。当你在文本框中输入值的时候,他的文本属性会改变,绑定的扩展标签会自动的更形Label的内容。
停靠面板(DockPanel)停靠面板其实就是在2.0中类似于Dock属性的元素。DockPanel会对每个子元素进行排序,并停靠在面板的一侧,多个停靠在同侧的元素则按顺序排序,最后一个元素填充这个Panel(除非将LastChildFill属性设置为。对于在DockPanel中的元素的停靠属性可以通过的附False,它才会使得没有填充的部分为空)加属性来设置,如下:
网格面板(Grid)Grid与其他面板不同的是,他的面板布局由
跨越多行和多列使用Span和n附加属性可以让相互间隔的行列合并。网格的连续性网格的连续性要实现的效果是对于不同的Grid使得它们的行列一致,如将Grid放置在一个ScrollViewer中要显示Tilte等标题信息和明细信息,那么放置于同一Grid时会在明细太多的时候下拉滚动条,会使标题信息消失,那么就要用到2个Grid,一个用来显示标题信息,一个用来显示详细信息,那么2个Grid会出现列对齐不一致的问题。采用不同Grid之间的共享尺寸组,可以解决此问题。Grid的共享尺寸组的作用范围是限制在其父元素之下,也就是在不同父元素之下的Grid即使共享尺寸组名称相同,那么它们也不会采用相同的格式。edSizeScope的附加属性定义在DockPanel中,用来标明DockPanle是一个公用的父元素。将SharedSizeGroup将不同列划分相同的组。参考:/zh-cn/library/edsizescope(VS.90).aspx均布网格(UniformGrid)一笔带过,均布网格的是Grid的简化版本,每个单元格的大小相同,不用在定义行列集合。均布网格每个单元格只能容纳一个元素,将自动按照定义在其内部的元素个数,自动创建行列,并通常保持相同的行列数。画布(Canvas)画布只是一个为元素的放置提供场所的一个容器,不会自动调整内部元素的排列及大小。不指定元素位置,
元素将默认显示在画布的左上角。Canvas的主要用途是用来画图。Canvas不会自动裁减超过自身范围的内容,即多出的内容会显示在Canvas外面,那是因为默认ClipToBounds="False";如果设置ClipToBounds="True",则会裁剪多于内容。视图框(ViewBox)ViewBox会自动缩放其内容以填充可用的空间。ViewBox由Derector派生而来,只能有一个子元素,严格上来说不是面板。由于Canvas不会随着画布大小个改变而调整画布内部的元素大小,所以当Canvas放置在ViewBox中是,画布内的元素就可以自动调整大小了。其中ViewBox的Stretch属性有Fill、None、和UniformToFill三种模式,Fill使得元素被拉伸填满ViewBox,None的视乎没有意义,因为设置了Stretch为None,则跟没有使用ViewBox没有区别。UniformToFill将保持元素大小,并在元素大于ViewBox的时候,在一个方向是截取元素内容。公共布局属性Margin是元素与其停放父元素的间距,Padding是指在本元素内部的元素内容与边缘的距离。FlowDirection属性标示元素的内容显示方向。是相对于显示屏的Z轴坐标,用于调整层叠元素的现实先后。RenderTransform和LayoutTransform用来将缩放和旋转的变换应用到某个元素上。WPF数据绑定控件DataGridWPF中的DataGrid和Winform、里的DataGridView、GridView使用差不多。示例代码:XAML:
///测试数据实体类///[Serializable]publicclassTestData{publicintID{get;set;}publicstringName{get;set;}publicTestData(){}publicTestData(int_ID,string_Name){ID=_ID;Name=_Name;}}publicpartialclassDgDemo:Window{publicDgDemo(){InitializeComponent();}privatevoidWindow_Loaded(objectsender,RoutedEventArgse){List
ListBoxListBox绑定数据比较简单,在c#代码中直接用ItemsSource即可,如:ource=tData();//数据源yMemberPath=”Name”;//要绑定的列名在xaml中的写法:
{ource}==tData();tData();数据源cs://///////
WPF动画动画无疑是WPF中最吸引人的特色之一,其可以像Flash一样平滑地播放并与程序逻辑进行很好的交互。WPF中的动画类型可以分为:属性动画、路径动画、关键帧动画。在WPF中,通过对对象的个别属性应用动画,可以对对象进行动画处理。例如,若要使框架元素增大,请对其Width和Height属性进行动画处理。若要使对象逐渐从视野中消失,可以对其Opacity属性进行动画处理。要使属性具有动画功能,属性必须满足以下三个要求:★它必须是依赖项属性。★它必须属于继承自DependencyObject并实现IAnimatable接口的类。★必须存在可用的兼容动画类型。WPF包含许多具有动画属性的对象。诸如Button、TabControl和Panel控件以及Shape对象都继承自DependencyObject。它们的大多数属性都是依赖项属性。在应用到复杂动画时就需要用到Storyboard(故事板),Storyboard可以看作是Animation的容器,它包含了若干的简单动画来完成一个复杂动画。参考资料:/zh-cn/library/代码示例:XAML:
{=newta=newThicknessAnimation();106,106,0,0,0);0);Thickness(64,Thickness(259,=new=conds(1);=d;EventHandler(ta_Completed);ta);ted+=nimation(Property,}void{ta_Completed(objectsender,EventArgse)==newnew=ta2=newThicknessAnimation();106,0,0,0);0);Thickness(259,Thickness(64,106,conds(3);=d;ta2);nimation(Property,}private{voidbutton2_Click(objectsender,RoutedEventArgse)==1;=0.1;da=newDoubleAnimation();conds(8);=;da);nimation(OpacityProperty,}
WPF与windows7开发多点触控程序一、安装多点触控模拟器通过下载Multi-TouchVista安装多点触控模拟器,利用鼠标模拟多点触控功能,解决没有多点触控屏的硬件问题。安装步骤:/gnielee/archive/2010/08/16/二、多点触控程序开发WPF4.0为在Windows7下运行的程序提供了两个多点触控接口。为了专门使用多点触控,开发者希望探索低级别接口,该接口包含由UIElement定义的多个路由事件(名为TouchDown、TouchMove、TouchUp、TouchEnter和TouchLeave)以及向下、移动和向上事件的预览版本。显然,这些事件是根据鼠标事件建模的,但需要一个整数ID属性来跟踪显示屏上的多根手指。WPF4.0中的高级别多点触控支持,它包含一个名称以“Manipulation”一词开头的事件的集合。些操作事件执行多个关键的多点触控作业:这事件将两根手指的交互合并成单个操作将一根或两根手指的移动解析成转换在手指离开屏幕时实现延时WPF4.0的多点触控事件:ManipulationStartingManipulationStartedManipulationDeltaManipulationInertiaStartedManipulationBoundaryFeedbackManipulationCompleted完整的操作是从ManipulationStarting事件开始,紧接着是ManipulationStarted,并最终以ManipulationCompleted结束。如图:中间可能有多个ManipulationDelta事件。
每个操作事件都附带有其自己的事件参数集,该参数集封装在一个根据该事件命名并附加了EventArgs的类中,例如,ManipulationStartingEventArgs和OriginalSource属性。与操作事件相关联的每个事件参数类都包括一个名为ManipulationContainer的属性。这是发生多点触控操作的元素。操作事件中的所有坐标都相对于此容器。默认情况下,ManipulationContainer属性设置为与Source和OriginalSource属性相同的元素,也就是被操作的元素,不过这可能不是您所希望的。通常,大家不希望操作容器与被操作的元素相同,因为动态移动、缩放和旋转报告触控信息的同一元素需要技巧性很强的交互。应将操作容器作为被操作元素的父项,或者作为沿可视化树向上追寻的某个元素。在大多数操作事件中,ManipulationContainer属性都是只读属性。但元素接收的第一个操作事件例外。在ManipulationStarting中,可以将ManipulationContainer更改为更适合的容器。设置:lationContainer=this;//这里可以指定为其它容器ManipulationDeltaEventArgs。这些类从InputEventArgs派生,而后者又从RoutedEventArgs派生。这些类包括指示事件来源的Source和ManipulationDelta和DeltaManipulationManipulationDelta具有四个属性:1)Translation属性,类型为Vector//平移
2)Scale属性,类型为Vector3)Expansion属性,类型为Vector4)Rotation属性,类型为double//缩放//缩放//旋转Vector结构定义double类型的两个属性,分别名为X和Y。translation属性指示水平方向和垂直方向的移动(或平移)。对元素的单指操作可生成平移变化,但平移也可以是其他操作的一部分。Scale和Expansion属性均指示大小变化(缩放),这始终需要两根手指。Scale依据乘法进行缩放,Expansion依据加法进行缩放。使用Scale可设置缩放转换;使用Expansion可按照与设备无关的单位增大或减小某个元素的Width和Height属性。在WPF4.0中,Scale矢量的X和Y值始终是相同的。操作事件不会提供足够的信息以各向异性的方式(即,在水平方向和垂直方向各不相同)缩放元素。示例代码://设置操作多触事件的容器private{//设置操作多触事件的容器lationContainer//设置可操作的类型=;=true;=MainGrid;voidimage1_ManipulationStarting(objectsender,ManipulationStartingEventArgse)d}//处理拖放、旋转、缩放private{varelement=sender=0.6;deltaManipulation=anipulation;asFrameworkElement;voidimage1_ManipulationDelta(objectsender,ManipulationDeltaEventArgse)yManipulationDeltaMatrixmatrix=;//设置中心点Pointcenter=newPoint(Width/2,Height/2);//处理缩放t(.X,r.Y);//处理旋转At(on,//处理平移ate(ation.X,d=true;=ation.Y);center.X,center.Y);.Y,center.X,centeMatrixTransform(matrix);//惯性边界控制if{(tial)
RectnderSize);Size));if{containerRect=newRect(((FrameworkElement)lationContainer).ReshapeBounds=ormBounds(newRect(element(!ns(shapeBounds))BoundaryFeedback(anipulation);te();}}}//惯性处理privateArgs{//移动惯性ationBehavior{InitialVelocity始时的初始速率DesiredDeceleration率一个WPF单位/ms};//缩放惯性ionBehavior{InitialVelocity=ionVelocity,=1/(1000.0*1000.0)//设置减慢速度=newInertiaExpansionBehavior()=1/(1000.0*1000.0)//设置减慢速度的速=Velocity,//惯性阶段开=newInertiaTranslationBehavior()e)voidimage1_ManipulationInertiaStarting(objectsender,ManipulationInertiaStartingEventDesiredDeceleration的速率一个WPF单位/ms};//旋转惯性onBehavior{InitialVelocity=newInertiaRotationBehavior()=rVelocity,=1/(1000.0*1000.0)//一个角度/msDesiredDeceleration};}//拖放、旋转、缩放等操作完成private{yelement=1;=(FrameworkElement);voidimage1_ManipulationCompleted(objectsender,ManipulationCompletedEventArgse)
}运行效果图:WPF3D应用利用WPF开发3D应用程序,需要主要几个要素:1、摄像机,是用来模拟成像的,现在WPF支持正交(orthographical)和透视(perspective)摄像机。你需要确定它的位置(position),镜头正对的方向(LookDirection),还有就是摄像机的向上方向(UpDirection)2、3D模型:一个3D模型定义了场景中的一个物体,包含一个Geometry对象。Geometry对象是一个网格,和一个材质(Material)对象,材质具有漫反射(diffuse),镜面(specular)或放射(emmisive)几种类型,材质本身具有一个画刷。如果想对材质进一步的了解,可以看:/,上面有对网格的详细解释。3、光源:如果场景中没有光源,你将什么也看不到。因此我们需要在我们的场景当中至少放置一个光源来照亮我们的模型。WPF支持如下几种不同的光源:AmbientLight(自然光),DirectionalLight(方向光)PointLight(点光源),SpotLight(聚光源)。你需要确定光源的方向(Direction),颜色(color)等属性。4、viewport3D控件:这个控件类似容器,放入上述的元件。其实在c#编程的时候,你会发现camera等式viewport3D的成员属性。WPF中3D常用的几个类:1、Visual类
Visual对象是一个核心WPF对象,其主要作用是提供呈现支持。用户界面控件(例如Button和TextBox)派生自Visual类,并使用Visual定义的属性来保存它们所呈现的数据。Visual对象可对下列功能提供支持:输出显示:为可视对象呈现持久的序列化绘图内容。转换:对可视对象执行转换。剪辑:为可视对象提供剪辑区域支持。命中测试:确定指定的坐标(点)或几何图形是否包含在可视对象的边界内。边界框计算:确定可视对象的边框。2、Visual3D类所有三维可视化元素的基类,提供可视三维对象通用的服务和属性,其中包括命中测试、坐标转换和边界框计算。3、Viewport3D类为三维可视内容提供呈现图面。4、Viewport3DVisual类在指定的二维视区边界内呈现Visual3D子对象。Viewport3DVisual是具有三维子对象的二维Visual对象。Viewport3DVisual为Viewport3D元素提供了必需的基础结构。大多数用户都需要使用Viewport3D元素。5、Model3D类为三维模型提供功能的抽象类。此类对象包括GeometryModel3D和Light。6、ModelVisual3D类包含三维模型的Visual。提供所有可视对象通用的服务和属性,其中包括命中测试、坐标转换和边界框计算。7、GeometryModel3D类创建由一个MeshGeometry3D和一个Material构成的三维模型。8、MeshGeometry3D类用于生成三维形状的三角形基元。详细资料:/ustc_msra_ase/archive/2010/11/28/3dTools组件下载地址:/代码实例演示小结四个“什么”:WPF是什么?WPF能给我们带来什么?WPF有些什么?对于WPF开发,我们要掌握些什么?


发布评论