Tooltip-Alternative: der HelpExtender
22. Februar 2009 von Werner Mager · Gelesen: 2263 · heute: 2Als Alternative zu Tooltips habe ich einen “HelpExtender” programmiert, der einen Hilfetext bereitstellt, wenn der Benutzer mit der Maus über ein Control geht oder dieses den Fokus erhält. Dabei ist der HelpExtender genauso bequem zu benutzen und unterstützt sogar mehrere Sprachen.
Die Idee
Mein Ziel war es, eine Komponente zu realisieren, die sich im Visual Studio genauso wie ein Tooltip benutzen läßt. Im Gegensatz zum Tooltip sollte die Komponente aber keinen Text direkt anzeigen, sondern über einen Event die Hilfetexte bereit stellen. So kann der Text an einer beliebigen Stelle ausgegeben werden, z.B. in einer Textbox oder in der Statusleiste.
Das Interface IExtenderProvider
Die Klasse Tooltip erweitert andere Controls um eine Eigenschaft “ToolTip”, über die sich der ToolTip -Text festlegen läßt. Genauso soll sich auch der HelpExtender verhalten. Dies geschieht über das Interface “IExtenderProvider”. Die Eigenschaft, die bereitgestellt werden soll, wird durch das Attribut “ProvideProperty” angegeben. Damit ergibt sich für den HelpExtender folgende Deklaration:
[ProvideProperty("HelpText", typeof(Control)), ToolboxItemFilter("System.Windows.Forms")] public class HelpExtender : Component, IExtenderProvider { ... }
Die Eigenschaft HelpText
Für die Eigenschaft HelpText muß nun noch eine Set und eine Get Methode geschrieben werden. In der Set-Methode wird zum einen der Helptext in der Hash-Table “helpTexts” gespeichert und zum anderen werden die Events MouseEnter, MouseLeave, GotFocus und LostFocus registriert. Hierdurch wird der HelpExtender beanachrichtigt, wenn der Benutzer mit der Maus über eins der verwalteten Controls geht oder dieses den Focus erhält:
public void SetHelpText(Control control, string caption) { if (caption != "") { helpTexts[control] = caption; control.MouseEnter += new EventHandler(control_MouseEnter); control.MouseLeave += new EventHandler(control_MouseLeave); control.GotFocus += new EventHandler(control_GotFocus); control.LostFocus += new EventHandler(control_LostFocus); } else { helpTexts[control] = null; control.MouseEnter -= new EventHandler(control_MouseEnter); control.MouseLeave -= new EventHandler(control_MouseLeave); control.GotFocus -= new EventHandler(control_GotFocus); control.LostFocus -= new EventHandler(control_LostFocus); } }
Die Get-Methode sucht zu dem übergebenen Control den passenden Text:
[DefaultValue(""), Editor("System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=2.0.0.0", typeof(UITypeEditor)), Localizable(true)] public string GetHelpText(Control control) { if (control == null) { return string.Empty; } if (helpTexts[control] != null) { return ((string)helpTexts[control]); } return ""; }
Event-Verarbeitung
Nun wird noch ein Event samt passender Argumente und EventHandler benötigt, der über einen Hilfetext benachrichtig:
public delegate void HelpTextEventHandler(object sender, HelpTextEventArgs args); public class HelpTextEventArgs : EventArgs { string helpText; public string HelpText { get { return (helpText); } } public HelpTextEventArgs(string helpText) { this.helpText = helpText; } } public event HelpTextEventHandler HelpTextAvailable;
In der Eventbehandlung wird nun der HelpTextAvailable Event über die Methoden “provideHelpText” und “ClearHelpText” ausgelöst:
private void provideHelpText(Control control) { string text = (string)helpTexts[control]; if (text == null) text = ""; if (HelpTextAvailable != null) { HelpTextAvailable(this, new HelpTextEventArgs(text)); } } private void clearHelpText() { if (HelpTextAvailable != null) { HelpTextAvailable(this, new HelpTextEventArgs("")); } } void control_GotFocus(object sender, EventArgs e) { provideHelpText((Control)sender); } void control_MouseLeave(object sender, EventArgs e) { clearHelpText(); } void control_MouseEnter(object sender, EventArgs e) { provideHelpText((Control)sender); } void control_LostFocus(object sender, EventArgs e) { clearHelpText(); }
Das Ergebnis
Mit der so entstandenen Komponente lassen sich auf einfache und komfortable Weise Hilfetexte für Oberflächen realisieren. Auch die Lokalisierung stellt kein Problem dar. Zur Benutzung muß die Komponente einfach nur auf das gewünschte Form gezogen werden und die Hilfe-Texte müssen definiert werden. Durch einen Doppelklick auf den HelpExtender gelangt man zu dem Event, der ausgelöst wird, wenn ein Hilfetext bereit steht. Durch eine einfache Anweisung kann dieser z.B. auf ein StatusLabel übertragen werden:
private void helpExtender1_HelpTextAvailable(object sender, HelpTextEventArgs args) { this.toolStripStatusLabelHelp.Text = args.HelpText; }
Hier noch einmal ein Screenshot aus dem Beispielprojekt sowie der komplette Sourcecode zum Download:

Das Projekt steht hier zum Download bereit:
