Я написал небольшое приложение, которое показывает, как я буду справляться с описанным вами поведением.
Я настроил свою основную форму с четырьмя элементами управления (только кнопки для этого примера могут быть любыми элементами управления). Затем я установил другую форму, которая действует как выбор. Для этого примера он просто содержит ListBox с именами элементов управления. Вы могли бы сделать что-то более причудливое. Вы также можете передать текущий фокусированный элемент управления, чтобы тот уже был выбран в списке. По умолчанию я установил первый элемент управления в списке.
Я установил открытое свойство в MainForm под названием NextControl для хранения выбранного элемента управления из формы Chooser. Я также настроил свойство List для хранения ссылок на все элементы управления, из которых вы хотите выбрать. Используя этот метод, ShowDialog должен работать нормально, потому что фокус не устанавливается на элемент управления Next до тех пор, пока не завершится этот диалог.
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();
}
}
}
}
Вы можете изменить это в соответствии со своими потребностями. Для меня это изменило фокус.