2009-06-22 13 views
2

Ich versuche, ein Alt-Tab-ähnliches Verhalten für unsere Anwendung zu implementieren. Wenn der Benutzer Strg-Tab drückt, erscheint ein Formular (mit ShowDialog); Wenn sie es erneut drücken, wird das nächste Steuerelement in der Hauptform der App fokussiert. Wenn sie Strg freigeben, ist das Formular ausgeblendet.Wie kann ich eine Fokusänderung verhindern, wenn ShowDialog beendet wird?

Leider, wenn das passiert, wird Fokus auf ein anderes Steuerelement als das, das fokussiert wurde, gesendet. Wie kann ich eine Fokusänderung verhindern, wenn ShowDialog beendet wird?

+0

Welche Grafikbibliothek verwenden Sie? WinForms oder WPF? –

+1

Ich habe die Winforms-Registerkarte wegen der mehrfachen Verweise auf den Ctrl-Tab-Dialog und das Hauptfenster der App als "Formulare" hinzugefügt. –

Antwort

1

Sie könnten ein benutzerdefiniertes Dialogfeld schreiben, das das Steuerelement "An" als Eigenschaft akzeptiert .... beim Beenden können Sie den Fokus auf das Steuerelement "An" setzen.

0

Vielleicht möchten Sie die Funktionsweise Ihres Dialogs ändern. Wenn ich verstehe, was Sie sagen, können Sie stattdessen eine Eigenschaft auf Ihrem CtrlTabDialog erstellen, die angeben würde, welches Steuerelement den Fokus erhalten soll. Wenn Sie dann ShowDialog() beenden, bevor Sie das Formular CtrlTabDialog entsorgen, können Sie diese Eigenschaft lesen und den Fokus entsprechend auf den Code setzen, der ursprünglich für das Formular erstellt wurde.

0

Sie sollten ShowDialog() nicht für solche Zwecke verwenden. Stattdessen sollten Sie Show() und Hide() verwenden, mit Steuerlogik in Ihrem Hauptformular.

Sie können auch die Formularaktivierung überhaupt verhindern, in diesem Fall den Form-Nachfolger erstellen und die ShowWithoutActivation-Methode überschreiben.

Sie können auch meine Post here lesen.

0

Ich habe eine kleine App geschrieben, die zeigt, wie ich mit dem beschriebenen Verhalten umgehen würde.

Ich habe mein Hauptformular mit vier Steuerelementen eingerichtet (nur Schaltflächen für dieses Beispiel, können beliebige Steuerelemente sein). Dann richte ich ein anderes Formular ein, das als Wähler fungiert. In diesem Beispiel enthält es nur eine ListBox mit den Steuerelementnamen darin. Du könntest etwas Zarteres machen. Sie können das aktuell fokussierte Steuerelement auch übergeben, damit dieses bereits in der Liste ausgewählt ist. Ich war auf das erste Steuerelement in der Liste voreingestellt.

Ich habe eine öffentliche Eigenschaft auf der MainForm namens NextControl eingerichtet, um das ausgewählte Steuerelement aus dem Auswahlformular zu halten. Ich habe auch eine List-Eigenschaft eingerichtet, die Verweise auf alle Steuerelemente enthält, aus denen Sie auswählen können. Mit dieser Methode sollte ShowDialog funktionieren, da der Fokus erst dann auf das Next-Steuerelement festgelegt wird, nachdem das Dialogfeld beendet wurde.

Mainform:

using System.Collections.Generic; 
using System.Windows.Forms; 

namespace Tabber 
{ 
    public partial class MainForm : Form 
    { 
     public MainForm() 
     { 
      InitializeComponent(); 
      ControlList = new List<Control>(new Control[] {button1, button2, button3, button4}); 
     } 

     private List<Control> ControlList { get; set; } 

     public Control NextControl { get; set; } 

     private void MainForm_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Tab) 
      { 
       using (var chooseDialog = new Chooser(this, ControlList)) 
       { 
        if (chooseDialog.ShowDialog() == DialogResult.OK) 
        { 
         if (NextControl != null) 
         { 
          NextControl.Focus(); 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Chooser:

using System.Collections.Generic; 
using System.Windows.Forms; 

namespace Tabber 
{ 
    public partial class Chooser : Form 
    { 
     public Chooser(MainForm sender, List<Control> controls) 
     { 
      Sender = sender; 
      InitializeComponent(); 

      foreach (Control control in controls) 
      { 
       listBox1.Items.Add(control); 
      } 
      listBox1.DisplayMember = "Name"; 
      listBox1.SetSelected(0, true); 
     } 

     private MainForm Sender { get; set; } 

     private void Chooser_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Tab) 
      { 
       if (listBox1.SelectedIndex == listBox1.Items.Count - 1) 
       { 
        listBox1.SetSelected(0, true); 
       } 
       else 
       { 
        listBox1.SetSelected(listBox1.SelectedIndex + 1, true); 
       } 
       e.Handled = true; 
      } 
     } 

     private void listBox1_KeyUp(object sender, KeyEventArgs e) 
     { 
      if (e.KeyCode == Keys.ControlKey) 
      { 
       Sender.NextControl = (Control) listBox1.SelectedItem; 
       DialogResult = DialogResult.OK; 
       Close(); 
      } 
     } 
    } 
} 

Sie können dies ändern, um Ihre Bedürfnisse anzupassen. Es hat den Fokus richtig für mich verändert.

Verwandte Themen