Поделиться через


Пример 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

Download sample

Построение примера

  • Установите пакет средств разработки программного обеспечения для 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

Основные понятия

Общие сведения о системе команд