WPF编程宝典 - 27_3D绘图
WPF 引入了一个扩展的 3D 模型,允许您使用简单标记构建复杂的 3D 场景。辅助类提供了命中测试、基于鼠标的旋转以及其他基本构件。并且几乎所有的计算机都可以显示3D内容这一点要归功于当缺少显卡支持时 WPE退而使用软件涫染的能力。
3D绘图基础
WPF中的3D绘图涉及以下4可要点:
视口,用来驻留3D内容
3D对象
照亮部分或整个3D场景的光源
摄像机,提供在3D场景中进行观察的视点
当然,更复杂的3D场景将包含多个对象并且可能包含多个光源(如果3D对象本身发光的话,也可创建不需要光源的3D对象)。然而,这些基本要素提供了一个良好开端。
那么使用WPF3D支持的优点时什么呢?
可创建一些效果,而如果使用模拟的 3D 模型创建这些效果,就需要非常复杂的计算。一个好的例子是光照效果,如反射,当使用多个光源和具有不同反射属性的不同材质时,反射会变得非常复杂。
作为一组 3D 对象绘制的内容进行交互,这极大地扩展了通过代码能够完成的工作。例如,一旦构建期望的 3D 场景,旋转对象或者绕着对象旋转摄像机就变得很容易了。而如果使用 2D 编程完成相同的工作,就需要大量的代 ...
WPF编程宝典 - 26声音和视频
播放WAV音频
在.NET中播放音频文件的最简单方式是使用不很起眼的 SoundPlayer 类,该类位于同样不很起眼的 System.Media名称空间中。SoundPlayer 类的功能非常有限:只能播放 WAV 音频文件不支持同时播放多个声音,并且没有提供控制音频播放任何方面的能力(例如,音量和平衡等细节)。
如果能够忍受 SoundPlayer 类极大的局限性,那么这仍是为应用程序添加音频功能的最简单、最轻量级的方法。SoundPlayerAction类又对 SoundPlayer 类进行了封装,使用该类可通过声明的触发器播放声音(而不是在事件处理程序中编写几行 C#代码)
SoundPlayer类
为使用SoundPlayer类播放声音,需要执行以下几个步骤:
创建SoundPlayer实例
通过设置SoundLocation或Stream属性来指定声音内容。如果有指向WAV文件的文件路径,就使用SoundLocation属性。如果有基于流的包含WAV音频内容的对象,就使用Stream属性
一旦设置 Stream 或 SoundLocation 属性,就可以通过 ...
WPF编程宝典 - 25菜单、工具栏和功能区
菜单
WPF 提供了两个菜单控件:Menu(用于主菜单)和 ContextMenu(用于关联到其他元素的弹出菜单)。与所有 WPF 类一样,WPF 负责呈现 Menu和 ContextMenu 控件。这意味着这些控件不是简单的 Windows 库封装器,用户可获得更大的灵活性,包括在浏览器中驻留的应用程序中使用它们。
Menu类
WPF 没有假定单独的菜单应放在何处。通常使用DockPanel或Grid 面板的顶行将菜单停靠在窗口顶部,并将它拉伸到整个窗口的宽度。然而,可将菜单放在任何地方,甚至放到其他控件的边缘。甚至,还可在窗口中添加任意数量的菜单。尽管这可能不很合理,但可以堆栈菜单栏或在整个用户界面中分散布置。
Menu 类添加了新属性 IsMainMenu,当该属性为 true 时(这是默认值),按下 Alt 键或 F10键时菜单就会获得焦点,就像其他所有 Windows 应用程序一样。除这个细节外,Menu 容器还可以使用几个熟悉的 ItemsControl 属性。这意味着可使用 ItemsSource、DisplayMemberPath、ItemTemplate ...
WPF编程宝典- 24页面和导航
大多数传统的 Windows应用程序都以包含工具栏和菜单的窗口为中心。工具栏和菜单驱动应用程序–当用户单击它们时,动作发生,并且显示其他窗口。在基于文档的应用程序中,可能还有几个同样重要的立即打开的主窗口,但整个模型是相同的。用户将大部分时间都用在一个地方,并当需要时会跳到另一个单独的窗口。
Windows应用程序非常普遍,以至于有时都很难想象出不同的方式来设计应用程序。然而Web 开发使用非常不同的基于页面的导航模型,并且桌面开发人员发现对于设计特定类型的应用程序这是非常好的选择。在为桌面应用程序开发人员提供构建类似 Web 的桌面应用程序能力的呼声下,WPF提供了自己的基于页面导航的系统。正如您将在本章看到的,它是一个极其灵活的模型。
目前,基于页面的模型最常用于简单的轻量级应用程序(或用于更复杂的基于窗口的应用程序的子部分)。然而,如果希望精简应用程序部署,基于页面的应用程序是比较好的选择。这是因为 WPF 允许创建直接运行于Intemet Explorer 或 Firefox 浏览器中的基于页面的应用程序。这意味着用户不需要执行显式的安装步骤就可以运行应用程序——只 ...
WPF编程宝典 - 23窗口
Window类
Window类继承自ContentControl类。这意味着它只能包含单个子元素(通常是一个布局容器,如Grid控件),并且可使用由Background属性设置的画刷绘制背景。还可以使用BorderBrush和BorderThickness属性在窗口周围添加边框,当该边框会被添加到窗口框架之内(在客户区边缘周围)。可通过将WindowStyle属性设置为None,完全移除窗口框架,从而创建一个可完全定制的窗口。
客户区是窗口边界内部的表面,在其中可放置自定义内容。非客户区包括边框和窗口顶部的标题栏。非客户区由操作系统管理。
Window类的基本属性
名称
说明
AllowsTransparency
如果设置为 tue,而且如果背景被设置为透明色,Window类就允许其他窗口透过该窗口显示。如果设置为flse(默认值),窗口背后的内容就永远不能显示,并且透明的背景被呈现为黑色背景。当与 WindowStyle属性结合使用,并把 WindowSytle属性设置为 None时,可创建形状不规则的窗口
Icon
确定希望用于窗口的图标的 IageSour ...
WPF编程宝典 - 22列表、树和网格
得益于样式、数据模板以及控件模板提供的扩展功能,即使ListBox 控件(以及类似的ComboBox 控件)也可成为以各种方式显示数据的强大工具。然而,某些类型的数据表示形式只凭ListBox控件很难实现。幸运的是,WPE还提供了几个填补这一空白的富数据控件,包括以下几个控件:
ListView。ListView 继承自简单的没有特色的 ListBox。增加了对基于列显示的支持,并增加了快速切换视图或显示模式的能力,而不需要重新绑定数据以及重新构建列表。
TreeView。TreeView时层次化容器,这意味个创建多层数据显示。例如,可创建在第一级中显示类别组,并在每个类别节点中显示相关产品的TreeView控件。
DataGrid。DataGrid是WPF中功能最完备的数据显示工具。它将数据分割到包含行和列的网格中,就像ListView控件,但DataGrid控件具有其他格式化特性(比如冻结列以及设置单行样式的能力),并且支持就地编辑数据
ListView控件
ListView 类是一个特殊的列表类,它是专门针对显示相同数据的不同视图而设计的。如果需要构建显示每个数据项几 ...
WPF编程宝典 - 21数据视图
View对象
当将集合(或 DataTable)绑定到1temsControl控件时,会不加通告地在后台创建数据视图——位于数据源和绑定的控件之间。**数据视图是进入数据源的窗口,可以跟踪当前项,并且支持各种功能,如排序、过滤以及分组。**这些功能和数据对象本身是相互独立的,这意味着可在窗口的不同部分(或应用程序的不同部分)使用不同的方式绑定相同的数据。例如,可将同一产品集合绑定到两个不同的列表,并对产品进行过滤以显示不同的记录。
使用的视图对象取决于数据对象的类型。所有视图都继承自CollectionView类,并且有两个继承自CollectionView类的特殊实现:ListCollectionView和BeginListCollectionView。下面是CollectionView类的工作原理:
如果数据源实现了IBindingList接口,就会创建BindingListCollectionView视图。当绑定到ADO.NET中的DataTable对象时会创建该视图
如果数据源没有实现IBindingList接口,但实现了IList接口,就会创建ListCollect ...
WPF编程宝典 - 20格式化绑定的数据
数据转换
在基本绑定中,信息在从源到目标的传递过程中没有任何变化。这看起来是符合逻辑的,但我们并不总是希望出现这种行为。通常,数据源使用的是低级表达方式,我们可能不希望直接在用户界面中使用这种低级表达方式。例如,可能希望使用更便于读取的字符串来代替数字编码,数字需要被削减到合适的尺寸,日期需要使用长格式显示等。如果是这样的话,就需要有一种方法将这些数值转换为恰当的显示形式。并且如果正在使用双向绑定,还需要进行反向转换–获取用户提供的数据并将它们转换到适于在恰当的数据对象中保存的表示形式。
幸运的是,WPF提供了两个工具,可提供帮助:
字符串格式化。使用该功能个通过设置Binding.StringFormat属性对文本形式的数据进行转换——例如包含日期和数值的字符串。对于至少一般的格式化任务,字符串格式化是一种便捷的技术
值转换器。该功能更强大(有时更复杂),使用该功能可将任意类型的源数据转换为任意类型的对象表示,然后个传递到关联的控件。
使用StringFormat属性
为格式化需要显示的文本的数字,字符串格式化堪称完美工具。当设置Binding.StringForma ...
WPF编程宝典 - 19数据绑定
提高大列表的性能
如果处理大量数据——例如,数万条记录而不止几百条–您知道良好的数据绑定系统不仅仅需要绑定功能,还需要能够处理超大量的数据而不会严重降低显示速度或消耗大量的内存幸运的是,WPF 优化了其列表控件以为您提供帮助。
所有WOF列表控件(所有继承自ItemsControl的控件)都支持这些增强特性,包括低级的ListBox和ComboBox
虚拟化
WPF列表控件提供的最重要功能是UI虚拟化(UI virtualization),UI虚拟化是列表仅为当前显示项创建容器对象的一种技术。 例如,如果有一个具有50 000条记录的ListrBox控件,但可见区域只能包含30条记录,ListBox控件将只创建30个ListBoxItem对象(为了确保良好的滚动性能,会再增加即可ListBoxItem对象)。如果ListBox控件不支持UI虚拟化,就需要生成全部50 000个ListBoxItem对象,这显然需要占用更多的内存。更有意义的是,分配这些对象需要的时间能够明显感觉到,当代码设置ListBox.ItemsSource属性时这会短暂锁定应用程序。
UI虚拟化支 ...
WPF编程宝典 - 18自定义元素
WPF支持样式、内容控件和模板,因此不再强调自定义控件。这些特性为每位开发人员提供了多种方式来完善和扩展标准的控件,而不用派生新的控件类。下面是几种可能的选择:
样式。可使用样式方便地重用控件属性的组合。甚至可使用触发器应用效果
内容控件。所有继承自ContentControl类的控件都支持嵌套的内容。使用内容控件,可以快速创建聚集其他元素的复合控件
控件模板。所有WPF控件都是无外观的。这意味着它们具有硬编码的功能,但它们的外观是通过控件模板单独定义的。使用其他新的控件模板代替默认模板,可重新构建基本控件
数据模板。所有派生自ItemsControl的类都支持数据模板,通过数据模板可创建某些数据对象类型的富列表示。通过恰当的数据模板,可使用许多元素的组合显示每个项,这些组合元素可以是文本、图像甚至可以是可编辑控件(都在所需的布局容器中)
如果可能的话,在决定创建自定义控件或其他了;诶新的自定义元素之前,可继续使用这些方法。这是因为这些解决方案更简单,更容易实现,并且通常更容易重用
那么,何时应创建自定义元素呢?
当希望微调元素的外观时,自定义元素并非最佳选择,但 ...