2009-04-21 11 views
2

HI, Ich erweitere eine in C# geschriebene Windows-Anwendung, um dem Benutzer (im Kontext des fokussierten Steuerelements) Hilfe zu geben, wenn er die F1-Taste drückt.Globaler Ereignishandler für alle Steuerelemente für Benutzerhilfe

Was ich tun möchte, ist die Verwendung des Control.HelpRequested-Ereignisses, aber ich bin mir nicht sicher, wie alle Steuerelemente erweitert werden, um dieses Ereignis zu behandeln. http://msdn.microsoft.com/en-us/library/system.windows.forms.control.helprequested.aspx

Es ist nicht wirklich machbar jede Kontrolle „von Hand“ zu aktualisieren, um dieses Ereignis zu behandeln und ich weiß nicht wirklich wie die Idee durch alle Steuerelemente in Form von Schleifen (wie das Formular geöffnet wird), um das Ereignis zu assoziieren Handler.

Gibt es eine gute Möglichkeit, alle Steuerelemente eines Formulars auf ein bestimmtes Ereignis anzuwenden?

Dies wird nur gemacht, aber ich fast das Gefühl, dass ich in der Lage sein sollte, sehr geschätzt so etwas wie diese

[HandleEvent Control.HelpRequested, ApplyTo Typeof(Control)] 
void MyEventHandler(object sender, EventArgs e) 
{ 
// code to handle event... 
}

Irgendwelche Vorschläge oder vielleicht Ideen auf einem anderen Ansatz zu schreiben sind - Dank

Antwort

2

Dieses Beispiel (http://www.codeproject.com/KB/cs/ContextHelpMadeEasy.aspx) zeigt, wie Sie die Taste F1 in WndProc abfangen und dann die Hilfe nur mit einer Methode anzeigen.

Die Idee in diesem Artikel besteht darin, eine Schnittstelle zu implementieren, die die ID der Steuerung ausgibt, und dann die Kontexthilfe basierend auf dieser ID anzuzeigen. Der F1-Handler überprüft dann, ob Ihr Steuerelement diese Schnittstelle implementiert, und wenn nicht, prüft es das übergeordnete Element des Steuerelements, bis es eine Implementierung dieser Schnittstelle findet. Ein noch einfacherer Ansatz (wenn Sie keine ID zu jedem Steuerelement hinzufügen möchten) besteht darin, den F1-Handler so zu ändern, dass Kontexthilfe basierend auf einem statischen Wörterbuch (z. B. Dictionary) angezeigt wird, das Topic-IDs enthalten würde für jede unterstützte Steuerung. Wenn Sie also ein Thema mit einem bestimmten Steuerelement verknüpfen möchten, müssen Sie das Wörterbuch aktualisieren.

Nochmals, es wäre klüger, diesem Ansatz mehr Abstraktion hinzuzufügen, indem Sie dem Wörterbuch eine Art Provider (Delegat oder Interface) hinzufügen. Beispielsweise benötigen Sie möglicherweise zusätzliche Logik, um Themen basierend auf Steuerelementtyp, Name oder einer anderen Eigenschaft anzuzeigen.

+0

Eigentlich habe ich diesen Artikel bereits gelesen und bin so weit gegangen, die ProcessKeyPreview-Methode zu implementieren (übrigens muss der Hilfe-Kontext direkt von der Datenbank kommen, also das Fenster-Hilfe-Dateiformat isn 't eine Option). –

+0

Ich erinnerte mich dann daran, dass ich mithilfe des Fragezeichenknopfs Hilfe geben musste (normalerweise oben rechts in einem Formular), wo Sie auf ein Steuerelement klicken und wieder Kontexthilfe abrufen können. Nach einigen Nachforschungen stieß ich heute Morgen auf das HelpRequested-Ereignis, das passender erscheint als das Abfangen der F1-Taste, da das .NET-Framework dieses Ereignis speziell für Entwickler offenlegt, um ein Hilfesystem zu implementieren. Trotzdem Vorschlag - danke :) –

+0

Ja, das ist die vorgeschlagene Lösung, aber wenn Sie ein "globales" Ereignis auslösen möchten, dann können Sie es von WndProc selbst auslösen, und haben einen einzigen Event-Handler. – Groo

0

Ich mag wirklich nicht die Idee von Schleife durch alle Steuerelemente in einem Formular (wie das Formular öffnet), um den Event-Handler zu assoziieren.

Kann ich fragen, warum nicht?

Sie könnten eine Funktion schreiben, die einen Delegaten und eine Liste von Typen als Argument annimmt, die genau die gleiche Wirkung haben wie Ihr "wanted for" - HandleEvent-Attribut.

+1

es gut fühlt sich einfach nicht "sauber" an - der Code müsste die Kontrollhierarchie durchlaufen. Ihr Delegierten-Vorschlag würde auf jeden Fall funktionieren, danke :) –

0

Die HelpRequested unterstützt Bubble-up-Mechanismus. Es wird für Ihre aktive Steuerung ausgelöst, und wenn Sie das Ereignis nicht behandeln und Handled -Eigenschaft seines Ereignisarg nicht auf true setzen, dann sprudelt es bis zu der übergeordneten Steuerungshierarchie, um zu erstellen.

So ist es genug, um Ihre HelpRequested Ihres Formulars zu behandeln, und dann können Sie entscheiden über die Hilfe, die Sie anzeigen möchten, basierend auf aktiver Kontrolle des Formulars oder seiner übergeordneten Hierarchie.

Beispiel

Wenn Sie HelpRequested Ereignis des Formulars wie unten behandeln, dann, wenn Sie F1 ein Meldungsfeld drücken, wird Pop-up und zeigen Name der aktiven Steuerung:

private void Form1_HelpRequested(object sender, HelpEventArgs hlpevent) 
{ 
    var c = this.ActiveControl; 
    if(c!=null) 
     MessageBox.Show(c.Name); 
} 
+0

Ich weiß, dass dies eine alte Frage ist, aber die Antwort könnte zukünftigen Lesern helfen. Es ist seltsam, warum solche Antworten nach fast 2500 Views nicht zur Verfügung standen! –

Verwandte Themen