Мнемоника на этикетках только фокусирует на элементе управления, который имеет следующий TabIndex
, и это все, что он делает.Вы не можете использовать его для непосредственного вызова чего-либо (например, события нажатия кнопки).
Вы можете использовать знание этого поведения для симуляции того, чего вы хотите достичь.Идея состоит в том, чтобы поместить в форму легкий, фокусируемый элемент управления с TabIndex
, который следует сразу за меткой, но в месте, где он не виден (например, за верхним левым углом).Затем делайте то, что вы будете делать с событиями фокуса этого скрытого элемента управления.
Вот полный автономный пример.В этом случае скрытым элементом управления будет флажок.
using System;
using System.Drawing;
using System.Windows.Forms;
public class MyForm : Form
{
public MyForm()
{
targetLabel = new Label()
{
Text = "&Label",
TabIndex = 10,
AutoSize = true,
Location = new Point(12, 17),
};
// you don't need to keep an instance variable
var hiddenControl = new CheckBox()
{
Text = String.Empty,
TabIndex = 11, // immediately follows target label
TabStop = false, // prevent tabbing to control
Location = new Point(-100, -100), // put somewhere not visible
};
hiddenControl.GotFocus += (sender, e) =>
{
// simulate clicking on the target button
targetButton.Focus();
targetButton.PerformClick();
};
targetButton = new Button()
{
Text = "&Click",
TabIndex = 20,
AutoSize = true,
Location = new Point(53, 12),
};
targetButton.Click += (sender, e) =>
{
MessageBox.Show("Target Clicked!");
};
dummyButton = new Button()
{
Text = "&Another Button",
TabIndex = 0,
AutoSize = true,
Location = new Point(134, 12),
};
dummyButton.Click += (sender, e) =>
{
MessageBox.Show("Another Button Clicked!");
};
this.Controls.Add(targetLabel);
this.Controls.Add(hiddenControl);
this.Controls.Add(targetButton);
this.Controls.Add(dummyButton);
}
private Label targetLabel;
private Button targetButton;
private Button dummyButton;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MyForm());
}
}