2010-03-08 8 views
5

Pre.net Ich verwendete MFC, ON_UPDATE_COMMAND_UI und die CCmdUI-Klasse, um den Status meiner Windows-Benutzeroberfläche zu aktualisieren. Von der älteren MFC/Win32 Referenz:Aktualisieren von UI-Objekten in Windows-Formularen

Typischerweise Menüpunkte und Schaltflächen der Symbolleiste haben mehr als einen Staat. Für Beispiel ist ein Menüeintrag grau hinterlegt (abgeblendet), wenn es im aktuellen Kontext nicht verfügbar ist. Menüpunkte können auch aktiviert oder deaktiviert werden. Eine Symbolleiste Schaltfläche kann auch deaktiviert werden, wenn nicht verfügbar ist, oder es kann überprüft werden.

Wer aktualisiert den Status dieser Elemente , wenn sich die Programmbedingungen ändern? Wenn ein Menüeintrag einen Befehl erzeugt, der beispielsweise von einem Dokument verarbeitet wird, ist es logisch, dass das Dokument den Menüeintrag aktualisiert. Das Dokument enthält wahrscheinlich die Informationen, auf denen das Update basiert.

Wenn ein Befehl mehr Benutzer-Interface-Objekte (vielleicht ein Menü Element und eine Schaltfläche in der Symbolleiste) hat, sind beide auf die gleiche Handler-Funktion weitergeleitet. Dies kapselt Ihre Benutzerschnittstelle Update-Code für alle gleichwertigen Benutzeroberflächenobjekte in einem einzigen Ort.

Das Framework bietet eine komfortable Schnittstelle für die automatische Aktualisierung von Benutzeroberflächenobjekten. Sie können wählen , um die Aktualisierung auf andere Weise, tun, aber die Schnittstelle ist effizient und einfach zu bedienen.

Wie lautet die Anleitung für .net Windows Forms? Ich verwende einen Application.Idle-Handler im Hauptformular, bin mir aber nicht sicher, ob dies der beste Weg ist. Ungefähr zu der Zeit, als ich alle meine UI-Updates in den Leerlauf-Event-Handler gestellt habe, begann meine App, einige Performance-Probleme zu zeigen, und ich habe noch keine Metriken, um dies nachzuverfolgen. Nicht sicher, ob es verwandt ist.

+0

Was genau sind Sie wieder versuchen zu tun? Versuchen Sie, Steuerelemente in WinForms-Anwendungen zu deaktivieren? –

+0

Deaktivieren/Aktivieren von Symbolleistenschaltflächen, Menüelementen usw. Aktivieren/deaktivieren Sie den Status der Prüftasten in der Symbolleiste, Menüelemente, die einen Prüfstatus anzeigen. Diese Art von Ding. Sehr Routine-Zeug. –

+2

Ja, Application.Idle. Wie Sie ein Perf-Problem haben könnten, wenn die App im Leerlauf ist, ist mysteriös. –

Antwort

1

Ich fand es am einfachsten, wenn der Ereignishandler für den Menüeintrag einen Hintergrund-Thread erzeugt, der den Menüeintrag deaktiviert, die Arbeit ausführt und den Menüeintrag dann wieder aktiviert. Auf diese Weise steht die Benutzeroberfläche für die Bearbeitung anderer Benutzeroberflächenanforderungen zur Verfügung, und nach Abschluss des Vorgangs muss nicht abgefragt werden.

Ich schließe normalerweise Logik ein, die mehr als eine Operation verhindert, die dieselben Ressourcen gleichzeitig verwendet. Dies bedeutet, dass eine Funktion zum gleichzeitigen Deaktivieren/Aktivieren aller ähnlichen Ressourcen erstellt wird. z.B. Ich erlaube mir vielleicht nur, dass eine Dateioperation gleichzeitig ausgeführt wird, also würde ich eine Funktion zum Deaktivieren/Aktivieren aller Menüelemente erstellen, die mit Dateioperationen verknüpft sind, und sie von jedem dieser Menüelemente aufrufen.

0

Ändern Sie einfach ihre Eigenschaft, z.

obj.Enabled = true; 

oder

obj.Enabled = false; 

Die Eigenschaft des Objekts wird automatisch .Invalidate() oder .Refresh() für Sie anrufen, so sollte die Steuerung automatisch neu gestrichen werden.

Wenn Sie eine BIG-Task ausführen möchten, die die Benutzeroberfläche für mehrere Sekunden blockiert, sollten Sie Threads + Delegates verwenden.

+0

Das mache ich jetzt im Application.Idle-Handler im Hauptformular. Ich versuche herauszufinden, wann und wo andere dies tun. Ich kann die Datenbindung nicht verwenden, da die von mir verwendeten Menüs und Symbolleisten keine Datenbindung bieten. –

+0

Nun, das würde bedeuten, den Application.Idle-Handler für größere Formulare zu sprengen. Du solltest das wirklich nicht tun. mach es einfach, wenn es nötig ist. zB: füge ein onclick-event zu einer Schaltfläche hinzu. Deaktivieren Sie in Ihrem Handler ein anderes Steuerelement. setze das nicht in application.idle. –

1

AFAIK, in der Standard-.NET System.Windows.Forms Welt ist diese Funktionalität nicht out-of-the-box verfügbar. Dieses Problem kann auf verschiedene Arten beantwortet werden. Die folgenden Links sind nützliche Ressourcen:

OnUpdate equivalent

ActionLists for Windows forms

Command UI Updating Windows Forms in C#

+1

Ich sah einige dieser Links vorher und ich habe meine eigene Implementierung des Befehlsmusters. Alle diese Typen verwenden das Application.Idle-Ereignis für die Aktualisierung. Ich schätze, dass alles da ist. Der alte C++ MFC Weg war aber ziemlich cool. –