65.9K
CodeProject 正在变化。 阅读更多。
Home

通用的 WPF 向导 / 过程对话框

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.61/5 (19投票s)

2008 年 1 月 31 日

CPOL

5分钟阅读

viewsIcon

117286

downloadIcon

4964

一篇介绍 ProceedureDialog.dll 的文章,这是一个用于创建向导式界面/过程对话框的自定义控件

Proceedure Dialog Sample

引言

本文介绍 ProceedureDialog.dll,这是一个控件库,允许创建一致的 vista 风格的向导界面。

背景

“向导是一种用户界面元素,用户通过一系列对话框来完成。与大多数现代用户界面范例不同,用户被迫按特定顺序执行任务。但是,对于复杂或不经常执行的任务,用户可能不熟悉涉及的步骤,这可能更容易让他们执行任务。”--- 维基百科 向导(软件)

“向导在首次广泛使用时引起了用户界面设计师的争议,因为它们鼓励使用模态窗口,一些人认为 [weasel words] 与正确的人机界面设计背道而驰。向导范例的支持者认为,在界面设计中,遵守他们认为是任意规则应次于易用性。” --- 维基百科 向导(软件)

尽管存在一些争议,向导仍然是软件工程师工具箱的重要组成部分;甚至微软也使用向导,例如“添加硬件向导”。

Add Hardware Wizard

本文提出的向导并不完全符合维基百科的定义;它不是强制用户按特定顺序进行,而是在可能的情况下(即在处理任务之前)允许非线性操作,而是使用 Microsoft Windows Vista 的控件盒范例,如下所示。因此,该控件被定义为过程对话框。

Control Panel Layout

过程对话框阶段

引言

目的:向用户介绍向导,说明向导的目的,并选择性地提供关于向导启动的信息。

此向导的页面是从各种动态链接库(dll)动态加载的,因此会显示已加载的组件。

Proceedure Dialog Sample - Introduction

配置

目的:允许设置任务的各种选项。

左侧窗格中显示的选项仅指代已加载的具有关联选项面板的组件,而不是所有已加载的配置面板。请注意,用户不仅可以通过“下一步”和“上一步”按钮以线性方式在配置页面(以及介绍或确认页面)之间切换,还可以通过左侧面板的索引以非线性的方式进行切换。

Proceedure Dialog Sample - Configuration

确认

目的:确认所选的配置选项。

显示所选选项的简要摘要。在用户可以通过“处理”按钮进入下一阶段之前,会显示一个对话框进行最终确认;这一点很重要,因为许多对话框(例如图示中的示例)在其处理过程中执行破坏性操作,即删除可能无法恢复的数据。

Proceedure Dialog Sample - Confirmation

进度

目的:显示正在执行的任务的状态。

此页面显示任务的状态,并且在有许多子任务的情况下,可以显示一个进度条,指示子任务名称和进度。在此阶段按下“关闭”按钮会显示一个关闭确认对话框,假设选择了“确定”或“是”,则会尝试终止任务。中止任务的状态显示在下面的对话框中。请注意,并非所有任务都可以中止(以防止数据损坏),因此软件可能会中止停止过程,并且对话框会告知用户这种情况。

Proceedure Dialog Sample - Progress

Proceedure Dialog Sample - Cancel Task

结果

目的:告知用户任务的结果,无论是好是坏(还是有趣的?)。

Proceedure Dialog Sample - Results

使用代码

创建过程对话框是一个简单的过程,只需使用相关变量调用构造函数并调用 show 即可。

//public ProceedureDialog(String title, IProceedureComponent introductionComponent, 
//                                        List<IProceedureComponent> configurationComponents,
//                                        IProceedureComponent confirmationComponent, 
//                                        IProceedureProcessComponent progressComponent, 
//                                        IProceedureComponent resultsComponent) {...}

ProceedureDialog d = new ProceedureDialog(title, introductionComponent, 
                                                   configurationComponents,
                                                   confirmationComponent, 
                                                   progressComponent, 
                                                   resultsComponent);
d.Show();            

介绍、确认和结果页面

组件应继承 UIElement,通常是 UserControl,并且必须实现 IProceedureComponent

IProceedureComponent 要求一个属性 KeyText,该属性应返回左侧索引中组件的名称;通常,介绍页面会返回 Introduction,配置页面返回 Configuration,结果页面返回 Results。

配置页面

配置页面与介绍(等等)页面类似,但是由于可能需要多个配置页面,因此作为列表 List<IProceedureComponent> 传递给 ProceedureDialog 的构造函数。然而,与介绍(等等)页面不同的是,KeyText 可能不会返回 Configuration,而是返回它所指代的选项的描述性名称(参见上面的 Configuration)。使用非标准名称时必须小心,确保名称足够短,以便其键保持在索引的范围内。

进度页面

进度页面的生成更为复杂,不仅需要实现 IProceedureComponent,还需要实现 IProceedureProcessComponent。与之前一样,组件至少还必须继承 UIElement

一旦确认页面的“处理”按钮被点击并且消息框确认已被同意,过程对话框将调用 void startProceedure() 方法。在 void startProceedure() 方法中,通常会启动一个新线程来处理任务;任务不能在调用 startProceedure() 的线程上完成,除非任务非常小,否则应用程序将显得无响应,Windows 将报告为不响应。

bool cancelProceedure() 方法会在用户尝试关闭过程对话框窗口(并同意取消任务)或点击取消按钮(并再次同意取消任务)时被调用。cancelProceedure() 方法可能会延迟正在执行的线程,因为它不是从事件调度线程调用的(实际上,演示的进度页面实现会在 cancelProceedure 中调用 Thread.Sleep(2000),而不会影响应用程序的响应能力)。

List <ProceedureCompleteDelegate> ProceedureCompleteDelegates 属性允许过程对话框附加到正在运行的任务,以便在任务完成时可以启用“下一步”按钮,允许用户进入结果页面。在未来的版本中,这将更改为标准的事件处理程序签名。

已知bug

  • ProceedureDialog 拼写错误,应为 ProcedureDialog

关注点

请注意,这是我第一个真正的 Windows Presentation Foundation 应用程序,因此设计可能有些地方不尽如人意。特别是这个库表明为什么可变的窗口透明度可能不是一个好主意。没有内置的方法来重新设计控件,因此可能需要修改代码。

为什么 Microsoft Visual Studio 不包含拼写检查器?

历史

1.0.0.0 --- 初始版本

其他许可说明

请随时在您的工作中随意使用此代码,但请注意,使用的是修改版的 Code Project Open License (CPOL);基本上与标准许可证相同,但未经事先授权,此代码不得用于商业或非营利性商业用途。请参阅随附的源代码和演示文件中的 license.txt 或 license.pdf。

© . All rights reserved.