通过系统计时器禁用命令源的示例
更新:2007 年 11 月
此示例演示如何通过 Windows.System.Timers.Timer 启用和禁用命令源。
Windows.System.Timers.Timer 在与 UI 线程不同的线程上运行,因此需要完成一些额外工作来更新 UI。另外一种解决此问题的方式(在大多数情况下也是一种更好、更优雅的方式)是使用 DispatcherTimer。这种方式更容易,因为 DispatcherTimer 在与 UI 线程相同的线程上运行。有关更多信息,请参见通过调度程序计时器禁用命令源的示例。但有时您可能需要使用不在 UI 线程上运行的类,因而此示例演示如何做到这一点。
诸如 MenuItem 类和 Button 类等命令源侦听它们附加到的 RoutedCommand 上的 CanExecuteChanged 事件,以便确定它们何时需要查询命令,以了解是否可以对当前命令目标执行该命令。如果命令无法执行,命令源通常会禁用自身;如果命令可以执行,则启用它们自身。例如,当命令无法执行时,MenuItem 会显示为灰色。
CommandManager 通过 RequerySuggested 事件通知 RoutedCommand 命令目标的条件已经改变。RoutedCommand 会引发命令源所侦听的 CanExecuteChanged 事件。通常,这一通知机制足以满足需要。但在某些情况下,CommandManager 不知道命令目标上的条件已经改变,因而永远不会引发 RequerySuggested 事件,并且命令源永远不会查询 RoutedCommand。在这些情况下,可以通过调用 InvalidateRequerySuggested 强制 CommandManager 引发 RequerySuggested 事件。
此示例创建了一个 RoutedCommand,它只能在当前时间的秒数大于目标值时执行。此示例还创建了一个 System.Windows.Timers.Timer,它每秒钟都会将一个作业推到 UI 线程的 Dispatcher 上。由于此作业是安排在 UI 线程的 Dispatcher 上的,因此 UI 线程将为我们更新 UI。
被推到 Dispatcher 上的方法将调用 InvalidateRequerySuggested。这可以确保命令源能够收到 CanExecuteChanged 事件,从而可以对该命令调用 CanExecute 方法。
有关命令的更多信息,请参见命令概述。
此示例演示 Windows Presentation Foundation 的特定功能,因此未遵循应用程序开发的最佳做法。有关 Windows Presentation Foundation (WPF) 和 Microsoft .NET Framework 应用程序开发的最佳做法的全面介绍,请相应地参考以下主题:
辅助功能 - 辅助功能最佳方案
安全 - Windows Presentation Foundation 安全性
本地化 - WPF 全球化和本地化概述
生成示例
安装 Windows 软件开发工具包 (SDK) 并打开其生成环境命令窗口。在“开始”菜单上,指向“所有程序”、“Microsoft Windows SDK”,然后单击“CMD Shell”。
将示例(通常位于软件开发工具包 (SDK) 文档中)下载到您的硬盘。
若要从生成环境命令窗口生成示例,请转到示例的源目录。在命令提示符处,键入 MSBUILD。
若要在 Microsoft Visual Studio 中生成示例,请加载示例解决方案或项目文件,然后按 Ctrl+Shift+B。
运行示例
若要从生成环境命令窗口运行已编译的示例,请执行示例源代码文件夹下包含的 Bin\Debug 或 Bin\Release 文件夹中的 .exe 文件。
若要在 Visual Studio 中调试运行已编译的示例,请按 F5。