C# пользовательское поведение клавиши ВВОД
У меня есть небольшой проект, в котором я хочу, чтобы несколько кнопок вели себя по-разному при нажатии или Ctrl+ щелчок. Чтобы достичь этого, каждая из этих кнопок имеет функцию такого рода, прикрепленную к их событию Click():
private void Button1_Click(object sender, EventArgs e)
{
int value = 10 //default value
bool boool = false;
if (ModifierKeys == Keys.Control)
{
using (var form = new NUP_Popup(0, value, value, "maximum ?"))
{ //creates a simple window that allows user to change the value of 'value'
form.ShowDialog();
if (form.DialogResult == DialogResult.OK)
{
value = form.retVal;
boool = true;
}
else return;
}
}
//do stuff here, either with default or user value
}
Теперь клики или Ctrl+ клики ведут себя так, как задумано с этой функцией. Моя проблема в том, что это поведение не применяется, когда мои кнопки активируются с помощью клавиши Enter: одна клавиша Enter запускает "нормальное" поведение, но Ctrl+Enter ничего не делает (кнопка не активируется).
Я уже переопределил функцию ProcessDialogKey(), чтобы закрыть окно при нажатии клавиши Escape, поэтому я подумал, что мог бы использовать ее, чтобы нажатия клавиш Enter вызывали функцию события Click():
protected override bool ProcessDialogKey(Keys keyData) //Allows quit when Esc is pressed
{
if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
{
this.Close();
return true;
}
if (keyData == Keys.Return)
{
this.OnClick(new EventArgs());
}
return base.ProcessDialogKey(keyData);
}
И вот где я застрял. Конечно, это ничего не делает, но я не знаю, что набирать в моем втором условии, чтобы оно работало.
Может я использую неправильный подход? Может ли кто-нибудь указать мне правильное направление, чтобы сделать это?
3 ответа
Я нашел решение, которое позволяет вам либо нажать Enter, либо Ctrl+Enter:
private void txtIP_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\n' || e.KeyChar == '\r') btnStart_Click(sender, new EventArgs());
}
Предполагая, что вы поместили ярлык с идентификатором Label1 и кнопку с идентификатором Button1, выполните следующее:
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "Button Clicked";
if (Control.ModifierKeys == Keys.Control) label1.Text += " with Ctrl";
}
private void button1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\n') button1_Click(sender, new EventArgs());
}
к вашему решению просто добавьте событие KeyPress к вашему Button1 и примените следующий код внутри события нажатия клавиши Button1_KeyPress:
if (e.KeyChar == '\n') Button1_Click(sender, new EventArgs());
Итак, я наконец нашел рабочее решение, добавив это в мой переопределенный метод ProcessDialogKey():
if (keyData == (Keys.Enter | Keys.Control))
{
(this.ActiveControl as Button).PerformClick();
}
Я не знаю, квалифицируется ли он как "чистый" код, но имеет смысл выполнить 2 моих требования: сделать Ctrl+Enter в качестве Ctrl+Click без необходимости объявлять 2 метода на кнопку.