Как вызвать событие ButtonClick, используя мнемонику метки? - PullRequest
4 голосов
/ 20 апреля 2011

В моем приложении на C # есть метка с мнемоникой (например, & Path) и кнопкой.Я хочу вызвать событие ButtonClick, когда пользователь нажимает мнемонику для метки (например, [Alt], а затем [P]).Но я не нашел ни одного события лейбла, чтобы справиться с этой ситуацией.Использование события OnFocus для кнопки не вариант, так как пользователь может использовать клавишу [Tab] для навигации.

Так есть ли способ достичь того, чего я хочу?

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 20 апреля 2011

или вы можете просто присвоить вашей кнопке имя, начинающееся с помета p, а затем поставить & перед ним, alt + p запустит обработчик событий btn_Click

Edit: Как насчет этого :) enter image description here

1 голос
/ 20 апреля 2011

Мнемоника на этикетках только фокусирует на элементе управления, который имеет следующий 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());
    }
}
0 голосов
/ 20 апреля 2011

Вы не указали тип вашего проекта (Winforms / WPF), но я думаю, что решение будет одинаковым для всех этих типов:
Вы должны установить KeyPreview в вашей форме на true и проверить нажатые клавиши в KeyUpобработчик события как nelow:

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.P && e.Alt == true)
        {
            MessageBox.Show("Got it");
        }
    }

В этом примере вы получите окно сообщения в случае нажатия Alt + P

...