Пример Disable Command Source Via System Timer
Обновлен: Ноябрь 2007
В этом примере демонстрируется включение и отключение источника команды посредством Windows.System.Timers.Timer.
Windows.System.Timers.Timer выполняется в отдельном потоке, отличном от потока пользовательского интерфейса, поэтому для обновления пользовательского интерфейса требуются некоторые дополнительные действия. Другой способ решения этой проблемы, в большинстве случаев лучший и более элегантный, состоит в использовании DispatcherTimer. Это проще, поскольку DispatcherTimer выполняется в потоке пользовательского интерфейса. Дополнительные сведения см. в разделе Пример Disable Command Source Via Dispatcher Timer. Поскольку бывают ситуации, когда требуется использовать объект, не выполняющийся в потоке пользовательского интерфейса, в данном примере показывается, как это выполнить.
Источники команд, например классы MenuItem и Button, прослушивают событие CanExecuteChanged от RoutedCommand, к которой они подключены, для определения, когда нужно запросить команду, чтобы увидеть, можно ли ее выполнить в целевом объекте текущей команды. Источники команд обычно самостоятельно отключаются, если команда не может быть выполнена, и включаются в обратном случае; например MenuItem самостоятельно отключается, если команда не может быть выполнена.
Объект CommandManager уведомляет RoutedCommand посредством события RequerySuggested о том, что целевой объект команды изменил состояние. RoutedCommand создает событие CanExecuteChanged которого ожидает источник команды. Обычно этого механизма уведомления достаточно, однако существуют некоторые ситуации, в которых CommandManager не уведомляется о том, что условия в целевом объекте команды изменились, и таким образом событие RequerySuggested никогда не вызывается, а источник команды никогда не запрашивает RoutedCommand. В этих случаях CommandManager может принудительно вызвать событие RequerySuggested путем вызова InvalidateRequerySuggested.
В этом примере создается RoutedCommand, которая может быть выполнена, только когда число секунд в текущем времени больше, чем в значении целевого объекта. Создается System.Windows.Timers.Timer, который каждую секунду потока пользовательского интерфейса помещает задание в Dispatcher. Поскольку это задание запланировано в Dispatcher потока пользовательского интерфейса, этот поток будет обновлять пользовательский интерфейс.
Метод, помещенный в Dispatcher, вызывает InvalidateRequerySuggested. Это гарантирует, что источник команды будет получать событие CanExecuteChanged, следовательно он сможет вызвать метод CanExecute для данной команды.
Дополнительные сведения о работе с командами см. в разделе Общие сведения о системе команд.
В этом примере описывается конкретная функциональная возможность Windows Presentation Foundation, и поэтому рекомендации по разработке приложений не соблюдаются. Более полное рассмотрение Windows Presentation Foundation (WPF) и рекомендации по тактике разработки приложений Microsoft .NET Framework см. в следующих источниках:
Специальные возможности: Рекомендации по специальным возможностям
Безопасность: Безопасность Windows Presentation Foundation
Локализация: Общие сведения о глобализации и локализации WPF
Построение примера
Установите пакет средств разработки программного обеспечения для Windows и откройте окно командной строки среды его построения. В меню "Пуск" выделите пункты "Все программы", "Пакет SDK для Microsoft Windows", а затем "Оболочки CMD".
Загрузите образец, как правило из документации пакета SDK, на жесткий диск.
Чтобы построить образец из окна командной строки среды построения, перейдите в исходный каталог образца. В командной строке введите MSBUILD.
Чтобы построить образец в Microsoft Visual Studio, загрузите решение образца или файл проекта и нажмите сочетание клавиш CTRL + SHIFT + B.
Выполнение примера
Для запуска скомпилированного образца в окне командной строки среды построения, выполните EXE-файл в папке Bin\Debug или Bin\Release, содержащихся в папке кода источника образца.
Для запуска скомпилированного образца с помощью отладки в Visual Studio, нажмите клавишу F5.
См. также
Задачи
Пример Disable Command Source Via Dispatcher Timer