Fokusprobleme bei eigenen ToolTips in Windows Forms

Aufgrund meines Artikels im dotnet Magazin “Frischer Wind für Windows Forms” habe ich schon einige positive Rückmeldungen erhalten. Vorab schon mal ein Dankeschön hierfür.

Des weiteren erhielt ich mehrere Fragen zu eigenen ToolTips. Bei eigenen Tooltips gibt es unter Umständen das Problem, dass der Fokus in den Tooltip wandert, aber allerdings nicht mehr an das eigentliche Control im Parent-Form zurückgeht.

 

Hierfür gibt es eine einfache Lösung.

Die Toolstrip Komponente kann man einfach um eine Property erweitern, die das Control hält, dass zuletzt den Fokus hatte. Dann erweitert man einfach die Komponenten um einen Event der beim Schließen des ToolTips gefeuert wird und implementiert diesen im Parent-Form, über die EventArgs gebe ich im nachfolgenden Code einfach die Referenz auf das Control zurück welches wieder den Fokus bekommen soll.

 

   1:   public sealed class CustomerViewToolTip : ToolStripDropDown
   2:      {
   3:          private Control lastFocusedControl;
   4:          public event EventHandler<ControlEventArgs> ToolTipClosed;
   5:   
   6:   
   7:          public CustomerViewToolTip()
   8:          {
   9:              CustomerView customerView = new CustomerView();
  10:              customerView.ShowCustomerClicked += customerView_ShowCustomerClicked;
  11:              ToolStripControlHost toolStripControlHost = new ToolStripControlHost(customerView);
  12:              this.Items.Add(toolStripControlHost);
  13:          }
  14:   
  15:          public Control LastFocusedControl
  16:          {
  17:              get
  18:              {
  19:                  return this.lastFocusedControl;
  20:              }
  21:              set
  22:              {
  23:                  this.lastFocusedControl = value;
  24:              }
  25:          }
  26:          
  27:          void customerView_ShowCustomerClicked(int id)
  28:          {
  29:              this.Close();
  30:          }
  31:   
  32:          protected override void OnClosed(ToolStripDropDownClosedEventArgs e)
  33:          {
  34:              base.OnClosed(e);
  35:              if (ToolTipClosed != null)
  36:                  ToolTipClosed(this, new ControlEventArgs(this.LastFocusedControl));
  37:              
  38:          }
  39:      }

 

 

Die Verwendung in einem Form sieht demnach wie folgt aus

 

   1:        private void button1_MouseEnter(object sender, EventArgs e)
   2:          {
   3:              if (sender as Control == null) return;
   4:              customerViewToolTip1.LastFocusedControl = sender as Control;
   5:              customerViewToolTip1.ToolTipClosed += customerViewToolTip1_ToolTipClosed;
   6:              customerViewToolTip1.Show(sender as Control, 2, 3);
   7:          }
   8:   
   9:          void customerViewToolTip1_ToolTipClosed(object sender, ControlEventArgs e)
  10:          {
  11:              e.ControlToFocus.Focus();
  12:          }

 

 

Ich hoffe diese Lösung hilft euch.

 

Technorati-Tags: ,,,
DotNetKicks-DE Image
Published Donnerstag, 4. Juni 2009 16:22 von ThorstenHans
Abgelegt unter: , ,

Kommentare

Keine Kommentare

Kommentar abgeben

(verpflichtend) 
(verpflichtend) 
(optional)
(verpflichtend)