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






3.61/5 (19投票s)
一篇介绍 ProceedureDialog.dll 的文章,这是一个用于创建向导式界面/过程对话框的自定义控件
引言
本文介绍 ProceedureDialog.dll
,这是一个控件库,允许创建一致的 vista 风格的向导界面。
背景
“向导是一种用户界面元素,用户通过一系列对话框来完成。与大多数现代用户界面范例不同,用户被迫按特定顺序执行任务。但是,对于复杂或不经常执行的任务,用户可能不熟悉涉及的步骤,这可能更容易让他们执行任务。”--- 维基百科 向导(软件)。
“向导在首次广泛使用时引起了用户界面设计师的争议,因为它们鼓励使用模态窗口,一些人认为 [weasel words] 与正确的人机界面设计背道而驰。向导范例的支持者认为,在界面设计中,遵守他们认为是任意规则应次于易用性。” --- 维基百科 向导(软件)。
尽管存在一些争议,向导仍然是软件工程师工具箱的重要组成部分;甚至微软也使用向导,例如“添加硬件向导”。
本文提出的向导并不完全符合维基百科的定义;它不是强制用户按特定顺序进行,而是在可能的情况下(即在处理任务之前)允许非线性操作,而是使用 Microsoft Windows Vista 的控件盒范例,如下所示。因此,该控件被定义为过程对话框。
过程对话框阶段
引言
目的:向用户介绍向导,说明向导的目的,并选择性地提供关于向导启动的信息。
此向导的页面是从各种动态链接库(dll)动态加载的,因此会显示已加载的组件。
配置
目的:允许设置任务的各种选项。
左侧窗格中显示的选项仅指代已加载的具有关联选项面板的组件,而不是所有已加载的配置面板。请注意,用户不仅可以通过“下一步”和“上一步”按钮以线性方式在配置页面(以及介绍或确认页面)之间切换,还可以通过左侧面板的索引以非线性的方式进行切换。
确认
目的:确认所选的配置选项。
显示所选选项的简要摘要。在用户可以通过“处理”按钮进入下一阶段之前,会显示一个对话框进行最终确认;这一点很重要,因为许多对话框(例如图示中的示例)在其处理过程中执行破坏性操作,即删除可能无法恢复的数据。
进度
目的:显示正在执行的任务的状态。
此页面显示任务的状态,并且在有许多子任务的情况下,可以显示一个进度条,指示子任务名称和进度。在此阶段按下“关闭”按钮会显示一个关闭确认对话框,假设选择了“确定”或“是”,则会尝试终止任务。中止任务的状态显示在下面的对话框中。请注意,并非所有任务都可以中止(以防止数据损坏),因此软件可能会中止停止过程,并且对话框会告知用户这种情况。
结果
目的:告知用户任务的结果,无论是好是坏(还是有趣的?)。
使用代码
创建过程对话框是一个简单的过程,只需使用相关变量调用构造函数并调用 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。