Возникает вопрос: как сделать так, чтобы кнопка по умолчанию была сфокусирована на фокусе формы и ответе на нажатие «Enter», но не была сфокусирована, когда курсор находится в текстовом поле с многострочным свойством, установленным, например, на true? .. Я знаю, что могу сделать некоторые исключения в коде, но, возможно, есть некоторые "лучшие практики", о которых я пока не знаю :( Спасибо





Может, я ошибся, но я бы сделал следующее:
и вуаля
У формы Windows есть два свойства: AcceptButton и CancelButton. Вы можете настроить их так, чтобы они ссылались на элементы управления кнопками в вашей форме. AcceptButton сообщает, какая кнопка должна быть нажата, когда пользователь нажимает клавишу ввода, а кнопка «Отмена» сообщает, какая кнопка должна быть нажата, когда пользователь нажимает клавишу выхода.
Часто вы устанавливаете DialogResult для AcceptButton на DialogResult.OK или DialogResult.Yes и DialogResult.Cancel или DialogResult.No для CancelButton. Это гарантирует, что вы можете легко проверить, какая кнопка была нажата, если вы отображаете форму модально.
(изменить - ответ здесь очень хорош для TextBox; этот шаблон может быть полезен для других элементов управления, в которых отсутствует AcceptsReturn или аналогичный)
Вы можете использовать события GotFocus и LostFocus, чтобы довольно легко изменить AcceptButton, например:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
TextBox multi, single;
Button btn;
using(Form form = new Form {
Controls = {
(multi= new TextBox { Multiline = true, Dock = DockStyle.Fill}),
(btn = new Button { Text = "OK", Dock = DockStyle.Bottom,
DialogResult = DialogResult.OK}),
(single = new TextBox { Multiline = false, Dock = DockStyle.Top}),
}, AcceptButton = btn
})
{
multi.GotFocus += delegate { form.AcceptButton = null; };
multi.LostFocus += delegate { form.AcceptButton = btn; };
btn.Click += delegate { form.Close(); };
Application.Run(form);
}
}
Какой прекрасный способ построить простую форму!
@Rune - нужно любить коллекции / инициализаторы объектов. Подлый бит - это «(varName = [initializer])», чтобы вы могли привязать переменную к событиям и т. д. ;-P
Не могли бы вы установить обработчики событий в инициализаторах? Итак, вместо добавления делегата внутри using вы могли бы сделать это в инициализаторе объекта?
@Rune - нет, для этого нет синтаксиса. Было бы неплохо, и это предлагалось (по-видимому, несколько похоже на инициализаторы коллекций), но пока без радости. Я тоже не затаил дыхание на C# 4.0.
@Marc: Жаль, но это по-прежнему элегантный способ создания формы.
или вы можете сделать это в событии de focus вашего текстового поля, как в
_targetForm.AcceptButton = _targetForm.btnAccept;
а затем свяжите его в другом текстовом поле с помощью мультилиний
спасибо :) думаю, что первый ответ в этой теме самый лучший и простой
на Form_Load установите
this.AcceptButton = buttonName;
Сделайте следующее:
private void Login_Load(object sender, EventArgs e)
{
this.AcceptButton = btnLogin;
}
(обратите внимание, что я ответил на ваш вопрос в ответе мой; этот комментарий как раз так, чтобы он появился на вкладке «Ответы»)