Freigeben über


Beispiel für das Deaktivieren der Befehlsquelle über den Systemzeitgeber

Aktualisiert: November 2007

In diesem Beispiel wird das Aktivieren und Deaktivieren einer Befehlsquelle über einen Windows.System.Timers.Timer veranschaulicht.

Ein Windows.System.Timers.Timer wird in einem anderen Thread als dem Thread für die Benutzeroberfläche ausgeführt, für die Aktualisierung der Benutzeroberfläche sind daher zusätzliche Schritte erforderlich. Eine andere, und in den meisten Fällen bessere und elegantere, Möglichkeit zum Beheben dieses Problems ist die Verwendung des DispatcherTimer. Dies ist einfacher, da der DispatcherTimer im gleichen Thread wie dem Thread für die Benutzeroberfläche ausgeführt wird. Weitere Informationen finden Sie im Beispiel Beispiel zum Deaktivieren der Befehlsquelle über den Verteilerzeitgeber. In einigen Fällen müssen Sie jedoch eine Klasse verwenden, die nicht im Thread für die Benutzeroberfläche ausgeführt wird. Daher wird dieses Verfahren in diesem Beispiel erläutert.

Befehlsquellen wie die MenuItem-Klasse und die Button-Klasse überwachen das CanExecuteChanged-Ereignis im RoutedCommand, dem sie angefügt sind. So können sie bestimmen, wann der Befehl abgefragt werden muss, um zu ermitteln, ob der Befehl für das aktuelle Befehlsziel ausgeführt werden kann. Befehlsquellen deaktivieren sich normalerweise selbst, wenn der Befehl nicht ausgeführt werden kann. Sie aktivieren sich selbst, wenn der Befehl ausgeführt werden kann. Dies ist z. B. der Fall, wenn ein MenuItem ausgegraut wird, wenn der Befehl nicht ausgeführt werden kann.

Der CommandManager benachrichtigt den RoutedCommand über das RequerySuggested-Ereignis darüber, dass Bedingungen mit dem Befehlsziel geändert wurden. Der RoutedCommand löst das CanExecuteChanged-Ereignis aus, das von der Befehlsquelle überwacht wird. Normalerweise ist dieser Benachrichtigungsmechanismus ausreichend, in einigen Fällen erkennt der CommandManager jedoch nicht, dass die Bedingungen für das Befehlsziel geändert wurden. Das RequerySuggested-Ereignis wird daher nicht ausgelöst, und die Befehlsquelle fragt den RoutedCommand nicht ab. In diesen Fällen kann erzwungen werden, dass der CommandManager das RequerySuggested-Ereignis auslöst, indem InvalidateRequerySuggested aufgerufen wird.

In diesem Beispiel wird ein RoutedCommand erstellt, der nur ausgeführt werden kann, wenn der Wert für die Sekunden im aktuellen Zeitgeber größer als ein Zielwert ist. System.Windows.Timers.Timer wird erstellt. Hierdurch wird jede Sekunde ein Auftrag an den Dispatcher des Threads für die Benutzeroberfläche gesendet. Da dieser Auftrag im Dispatcher des Threads für die Benutzeroberfläche geplant wird, aktualisiert der Thread für die Benutzeroberfläche die Benutzeroberfläche.

Die Methode, die an den Dispatcher gesendet wird, ruft InvalidateRequerySuggested auf. So wird sichergestellt, dass die Befehlsquelle das CanExecuteChanged-Ereignis empfängt, damit sie die CanExecute-Methode für den Befehl aufrufen kann.

Weitere Informationen über Befehle finden Sie unter Befehlsübersicht.

In diesem Beispiel soll nur ein bestimmtes Feature von Windows Presentation Foundation veranschaulicht werden, daher werden die bewährten Methoden für die Anwendungsentwicklung nicht befolgt. Ausführliche Informationen über empfohlene Vorgehensweisen bei der Anwendungsentwicklung für Windows Presentation Foundation (WPF) und Microsoft .NET Framework finden Sie unter folgenden Themen:

Eingabehilfen – Bewährte Methoden für Eingabehilfen

Sicherheit – Windows Presentation Foundation-Sicherheit

Lokalisierung – Übersicht über WPF-Globalisierung und -Lokalisierung

Download sample

Erstellen des Beispiels

  • Installieren Sie das Windows Software Development Kit (SDK) und öffnen Sie dessen Buildumgebungs-Befehlsfenster. Zeigen Sie im Startmenü auf Alle Programme und Microsoft Windows SDK, und klicken Sie dann auf CMD Shell.

  • Laden Sie das Beispiel, normalerweise aus der Software Development Kit (SDK)-Dokumentation, auf Ihre Festplatte herunter.

  • Um das Beispiel über das Buildumgebungs-Befehlsfenster zu erstellen, wechseln Sie zum Quellverzeichnis des Beispiels. Geben Sie an der Eingabeaufforderung MSBUILD ein.

  • Um das Beispiel mit in Microsoft Visual Studio zu erstellen, laden Sie die Projektmappe oder Projektdatei des Beispiels, und drücken Sie STRG+UMSCHALT+B.

Ausführen des Beispiels

  • Um das kompilierte Beispiel über das Buildumgebungs-Befehlsfenster auszuführen, führen Sie die EXE-Datei aus dem Ordner Bin\Debug oder Bin\Release, die unter dem Quellcodeordner des Beispiels enthalten sind, aus.

  • Um das kompilierte Beispiel in Visual Studio mit Debuggen auszuführen, drücken Sie F5.

Siehe auch

Aufgaben

Beispiel zum Deaktivieren der Befehlsquelle über den Verteilerzeitgeber

Konzepte

Befehlsübersicht