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.
Welche Grafikbibliothek verwenden Sie? WinForms oder WPF? –
Ich habe die Winforms-Registerkarte wegen der mehrfachen Verweise auf den Ctrl-Tab-Dialog und das Hauptfenster der App als "Formulare" hinzugefügt. –