【51CTO独家特稿】Windows 7 UI中最令人兴奋的元素莫过于新的任务栏或Jump List(跳转列表),虽然这些都是视觉上的创新,但不可否认,现在应用程序UI已经成为应用程序的一个重要组成部分。作为一名WPF开发人员,可以将这些元素放进你的应用程序,使其更适合于在Windows 7上运行,对主窗口内外的行为可以完全自定义。
#T#
使用WPF 4,你几乎可以获得Windows 7 UI最大特色的所有功能,WPF 4内置支持Windows 7任务栏,包括自定义缩略图预览,从任务栏的进度条、图标和Jump List就可以看见反馈信息,这些功能最终由Windows 7本地API提供,但WPF使用托管代码打包了这些API,并以WPF类的形式暴露出来,这意味着你可以在XAML中创建Jump List和其它UI对象,并通过大量的依赖属性绑定它们。
Visual Studio 2010拥有大量的与WPF相关的新功能,包括新的可视化设计器,拖放式数据绑定,在XAML中智能感知标记扩展,这些功能结合WPF新的任务栏类,使用最新版本Visual Studio 2010中的强大功能,让你可以构建最新的Windows 7应用程序。51CTO向您推荐《Visual Studio 2010应用与开发详解》专题以便于更多了解Visual Studio 2010。
虽然WPF 4完全支持任务栏,但还包括了Windows 7 API不包括的其它功能,如Windows 7风格的通用对话框,你可以从Windows API代码包中获得这些功能。Windows API代码包也有自己的一套Shell和任务栏类,从WPF 3.5 SP1中就有了。
数据绑定和Visual Studio 2010 WPF设计器
在谈及Windows 7细节之前,我们先看看如何在Visual Studio 2010 WPF设计器中建立一个基本的数据驱动WPF应用程序。在Visual Studio 2010中,通过把数据源拖放到可视化设计器中,在设计时就可以设置好数据绑定。欲了解WPF设计,51CTO向您推荐《让你的代码“炫”起来——WPF开发教程》。
如果你拖动一个数据源到一个现有的控件上(假设是一个文本框中的文本字段),设计器将会为那个数据源创建一个窗口资源,然后将字段绑定到控件上。相反,如果你拖动数据源到一个容器上,设计器会创建一个合适的绑定控件,并将其添加到容器上,如果默认的控件并不合适,你还可以对其进行设置,在图1中,我从AdventureWorks 2008示例数据库拖放了一个视图到窗口中,自动创建一个数据网格(data grid),在Windows 7任务栏上显示进度时我们需要用到数据网格。
图 1 在主窗口上放置一个视图数据源,自动产生一个绑定的数据网格
作为基本设置的一个额外项目,我们将介绍一下使用渐变画笔设置一个窗口的背景,Visual Studio 2010内置了一个可视化笔刷编辑器,可以方便地创建和使用渐变和图像刷以及纯色,在一个笔刷属性上点击下拉列表,打开属性编辑器,它允许你可视化地设置渐变或为图像刷选择一张图像。
图 2 使用可视化笔刷编辑器创建一个背景笔刷
Windows 7任务栏
在Windows 7中,你可以在任务栏上显示长时间操作的进度,就象IE浏览器在状态栏显示文件下载的进度条一样。
通过TaskbarItemInfo类,你可以和Windows 7任务栏进行交互,在主窗口上暴露一个依赖属性,你可以在XAML中创建TaskbarItemInfo:
- <Window.TaskbarItemInfo>
- <TaskbarItemInfo
- x:Name="TaskbarItemInfo1"
- Description="Customer Browser: Using WPF 4 on Windows 7”
- >
- </TaskbarItemInfo>
- </Window.TaskbarItemInfo>
你可以直接在XAML中编辑TaskbarItemInfo的属性,也可以在Visual Studio属性编辑器中进行编辑,XAML代码片段仅仅显示了名字和描述属性,描述属性就是为任务栏指定的提示文本,大多数任务栏功能都可以通过这个类的属性获得。
为了显示进度条,需要设置两个属性:ProgressValue和ProgressState。ProgressState开始时为None,你可以将其设定为Indeterminate显示一个帐篷式的进度条,或设置为Normal,我这里就是设为Normal的:
- TaskBarItemInfo1.ProgressValue = 0;
- TaskBarItemInfo1.ProgressState = TaskbarItemProgressState.Normal;
ProgressValue等于1.0时显示一个完整的进度条,为了跟踪数据表的填写,我们首先执行一个计数查询,计算出视图中的所有行数,使用这个值作为整个进度条的值,然后连接数据表的RowChanged事件,再增加下面两行代码更新进度条:
- this.rowsUpdated++;
- TaskbarItemInfo1.ProgressValue =
- ((double)this.rowsUpdated)/this.rowCount;
除了进度条外,你还可以使用图标叠加提供应用程序状态的反馈,图标叠加是在任务栏应用程序图标上方叠加一个小图标,它可以用于应用程序状态的传达,如播放或暂停,在线或离线,我们将会使用图标叠加为我们的客户列表显示一个过滤设置。
图3在任务栏上使用图标叠加显示了相同的应用程序,你会看到主程序中选中了“按国家过滤”的复选框,列表中的客户是按国家显示的,如果选中这个过滤器,任务栏图标上就会叠加显示一个选中国家国旗的小图标。
图 3 使用过滤设置的客户查看程序显示了一个叠加图标
通过对TaskbarItemInfo的Overlay属性指定一个图像资源就可设置一个叠加,对于示例,我为每个旗帜图像创建了一个位图资源,在设置过滤器时,我们可以从窗口资源载入图像,并设置叠加:
- string resourceKey = “flag_” + countryName;
- TaskbarItemInfo1.Overlay =
- (ImageSource)this.TryFindResource(resourceKey);
#p#
自定义缩略图
应用程序缩略图预览是UI打扮的一部分,当你的程序运行在Windows 7上,这个功能可以免费获得,Windows 7从任务栏为主程序窗口显示一个弹出式的缩略图,用户可以使用缩略图预览激活或关闭应用程序,或是在应用程序实例间进行切换。
你可以使用TaskbarItemInfo的ThumbnailClipMargin属性自定义应用程序的缩略图图像,使用这个属性,你可以在主窗口中指定一个矩形用于显示缩略图,而不是在整个主窗口范围显示。
ThumbnailClipMargin是一个依赖属性,因此除了指定一个静态的边界外,你可以将其绑定到其它控件的边界,使用那个控件进行应用程序预览,我使用这个方法设置缩略图预览只显示客户数据网格。
图 4 设置ThumbnailClipMargin绑定
图4显示了XAML中设置的绑定,也显示了Visual Studio 2010中新的标记扩展智能感应。
缩略图预览也包括一套工具栏按钮,允许用户直接从预览向程序发送命令,如发送媒体播放和暂停命令,对于示例,我创建了一个拷贝工具栏按钮,从一个文本框中拷贝客户的Email地址。
TaskbarItemInfo类包括一个集合属性,叫做ThumbButonInfos,通过它你就可以设置一个预览工具条,在Visual Studio 2010中,你可以在集合编辑器中编辑每个按钮,当然也可以直接在XAML中编辑。
ThumbButtonInfo通常指定发送的命令,命令目标,按钮使用的图像和提示文本,对于我们的拷贝按钮,代码如下:
- <ThumbButtonInfo Command="ApplicationCommands.Copy"
- Description="Copy E-Mail Address"
- ImageSource="/wpf4example;component/Images/copy.png"
- CommandTarget="{Binding ElementName=textBox1}" />
通过WPF命令的魔法,根据文本框中的文本是否处于选中状态,自动启用或禁用按钮。
图 5 自定义缩略图图像和拷贝工具条按钮
Jump List(跳转列表)
Jump List是常规任务或与程序相关文件的列表,在任务栏应用程序图标上点击右键时弹出Jump List,你 可以增加文件,任务或你自己的任务分类自定义应用程序的Jump List。
Jump List与应用程序本身关联,而不是一个特定的运行实例,你可以为你的应用程序增加一个自定义Jump List,或是在XAML文件(app.xaml)中向应用程序对象附加一个Jump List。
- <JumpList.JumpList>
- <JumpList ShowRecentCategory="True”
- ShowFrequentCategory="True">
- <JumpTask Title="Notepad”
- Description="Run Notepad" ApplicationPath="c:\windows\notepad.exe"
- IconResourcePath="c:\windows\notepad.exe"/>
- </JumpList>
- </JumpList.JumpList>
在XAML中设置Jump List时,应用程序初始化后它会自动应用到Windows Shell。
Jump List中可以包括跳转任务,启动其它程序,也包括一个挑战路径,链接到一个文件,如果你的应用程序是某个文件类型的注册处理程序,在Jump List中才会显示跳转路径。
Windows Shell维护一套最近和应用程序最常选择的文件的列表,你可以通过设置ShowRecentCategory和ShowFrequentCategory在应用程序Jump List中显示这些列表。
除了这些标准的分类外,你还可以创建自定义分类,下面的代码增加一个跳转任务链接到calc.exe,并将其归为自定义分类。
- JumpTask jumpTask1 = new JumpTask();
- jumpTask1.ApplicationPath =
- "C:\\windows\\system32\\calc.exe";
- jumpTask1.IconResourcePath =
- "C:\\windows\\system32\\calc.exe";
- jumpTask1.Title = "Calculator";
- jumpTask1.CustomCategory = "Calculation";
- JumpList jumpList1 = JumpList.GetJumpList(App.Current);
- jumpList1.JumpItems.Add(jumpTask1);
- jumpList1.Apply();
图 6 一个有标准分类和自定义分类的Jump List
Windows 7对话框和控件
WPF 4中未包括Windows 7的部分是通用文件对话框API,你可以从Windows API代码包获得,代码包让你可以从WPF应用程序启动通用对话框。将代码包程序集引入到你的应用程序,就可以使用代码包命名空间中的类,包括CommonDialog。
Windows 7也包括一些著名的文件夹,如桌面,图片库,你可以在CommonDialog指定文件路径,下面的代码指定的就是打开图片库:
- CommonOpenFileDialog dlg = new CommonOpenFileDialog();
- dlg.InitialDirectoryShellContainer =
- (ShellContainer)KnownFolders.PicturesLibrary;
你可以使用已知的文件夹或Shell对象为通用文件打开或文件保存对话框指定许多设置,例如,下面的代码增加视频库作为打开对话框新的打开位置:
- dlg.AddPlace((ShellContainer)KnownFolders.VideosLibrary,
- FileDialog.AddPlaceLocation.Bottom);
图 7 Windows 7打开文件对话框增加了一个自定义位置
Windows API代码包也提供了一个打包的WPF资源浏览器控件,你可以使用它来显示文件和其它Shell对象,只需要在XAML文件中声明它就可以使用了。
- <WindowsAPICodePackPresentation:ExplorerBrowser
- x:Name=”explorerBrowser1”/>
然后调用底层控件上的Navigate显示在你窗口中选择的文件夹。
- explorerBrowser1.ExplorerBrowserControl.Navigate(
- (ShelObject)KnownFolders.SampleMusic);
图 8 运行在一个示例应用程序中的Windows API代码包中的
新UI,新工具
使用WPF 4和Windows API代码包,通过完整的Visual Studio 2010 UI,你可以在本地Windows 7应用程序上加入很炫的功能,这对于开发人员来说可以收获巨大的成功感,新工具,新UI,让一切更美好!点击这里下载Visual Studio 2010。
原文出处:http://www.devx.com/VS_2010/Article/43562?trk=DXRSS_LATEST
原文名:Using Visual Studio 2010 to Write Killer WPF Apps for Windows 7
作者:Steve Apiki