Создание диалогового окна ввода в Windows Forms

Диалоговые окна часто используются в настольных приложениях для запроса данных у пользователя. В Windows Forms вы можете создать такое окно программно: создать новую форму, добавить на неё элементы управления (метки, текстовые поля, кнопки “ОК” и “Отмена”) и показать форму как модальное диалоговое окно. После закрытия диалога вы можете получить введённое значение и использовать его в приложении.
Что вы получите в этой статье
- Готовую реализацию InputBox на C# с пояснениями.
- Инструкцию по созданию и настройке кнопки, запускающей диалог.
- Таблицу свойств для элементов (локализованные подписи).
- Чек-листы для разработчика, тестировщика и дизайнера.
- Альтернативные подходы и рекомендации по локализации и безопасности.
Шаг 1. Добавление кнопки, которая откроет диалог
Добавляйте диалог только по событию: например, при клике по кнопке. Для начала сбросьте на форму кнопку из панели инструментов Visual Studio.
- Создайте новое приложение Windows Forms в Visual Studio.
- В панели Toolbox найдите элемент Button и перетащите его на форму.
- В окне свойств измените значения для кнопки следующим образом:
| Свойство | Новое значение |
|---|---|
| Name | dialogButton |
| Size | 400, 100 |
| Text | Открыть окно ввода |
Перетащите на форму Label и разместите её справа от кнопки.
В окне свойств для метки установите:
| Свойство | Новое значение |
|---|---|
| Name | labelResponseInput |
| Visible | False |
- Дважды щёлкните по кнопке “Открыть окно ввода” — Visual Studio сгенерирует обработчик события клика в файле кода формы.
private void dialogButton_Click(object sender, EventArgs e)
{
// Код, который выполнится при клике на кнопку
}Шаг 2. Реализация функции InputBox
Реализуем функцию, которая программно создаёт новую Form, добавляет на неё Label, TextBox и две кнопки, и возвращает DialogResult. Функция получает заголовок, текст подсказки и параметр ref для возврата введённого значения.
public static DialogResult InputBox(string title, string promptText, ref string value)
{
Form form = new Form();
Label label = new Label();
TextBox textBox = new TextBox();
Button buttonOk = new Button();
Button buttonCancel = new Button();
// Заголовок и текст подсказки
form.Text = title;
label.Text = promptText;
// Текст и результат для кнопок
buttonOk.Text = "OK";
buttonCancel.Text = "Отмена";
buttonOk.DialogResult = DialogResult.OK;
buttonCancel.DialogResult = DialogResult.Cancel;
// Позиционирование элементов
label.SetBounds(36, 36, 372, 13);
textBox.SetBounds(36, 86, 700, 20);
buttonOk.SetBounds(228, 160, 160, 60);
buttonCancel.SetBounds(400, 160, 160, 60);
// Свойства формы
label.AutoSize = true;
form.ClientSize = new Size(796, 307);
form.FormBorderStyle = FormBorderStyle.FixedDialog;
form.StartPosition = FormStartPosition.CenterScreen;
form.MinimizeBox = false;
form.MaximizeBox = false;
// Добавление контролов и привязка кнопок по умолчанию
form.Controls.AddRange(new Control[] { label, textBox, buttonOk, buttonCancel });
form.AcceptButton = buttonOk;
form.CancelButton = buttonCancel;
// Показать диалог и вернуть результат
DialogResult dialogResult = form.ShowDialog();
value = textBox.Text;
return dialogResult;
}Замечания:
- Параметр value передаётся по ссылке (ref) и после закрытия диалога содержит введённую строку.
- DialogResult позволяет определить, нажал ли пользователь “ОК” или “Отмена”.
Шаг 3. Вызов InputBox из обработчика кнопки
В обработчике dialogButton_Click создайте переменную и вызовите InputBox. Если диалог вернул OK — покажите результат в метке.
private void dialogButton_Click(object sender, EventArgs e)
{
string value = string.Empty;
if (InputBox("Диалог", "Как вас зовут?", ref value) == DialogResult.OK)
{
labelResponseInput.Visible = true;
labelResponseInput.Text = "Ваше имя: " + value;
}
}Запуск и проверка результата
- Нажмите зелёную кнопку запуска в Visual Studio.
- В приложении нажмите “Открыть окно ввода” — откроется сформированный вами диалог.
- Введите имя и нажмите OK — диалог закроется и метка покажет результат.
- Откройте диалог снова и нажмите Отмена — никаких изменений не произойдёт.
Советы по расположению и размерам элементов
- Подбирайте ширину текстового поля с запасом для ожидаемых данных; 700px в примере рассчитаны на длинные строки, но адаптируйте под локаль.
- Для коротких вводов (имя, номер) используйте меньшую ширину и компактные кнопки.
- Учитывайте масштабирование DPI: проверяйте интерфейс при 125% и 150% масштабировании.
Важно: фиксированные координаты просты и быстро работают для демонстрации, но для реального продукта лучше использовать TableLayoutPanel или TableLayout для адаптивного размещения.
Альтернативные подходы (когда это полезно)
- Использовать отдельную Form-класс (наследовать Form) с дизайнером, а не создавать элементы программно — удобнее для сложных форм.
- Для простых вводов можно использовать Microsoft.VisualBasic.Interaction.InputBox (требует ссылки на Microsoft.VisualBasic) — быстрый, но менее гибкий вариант и не всегда желателен в чисто C# проектах.
- В больших проектах применять MVVM/MVP-подход и показывать диалоги через сервис диалогов (DialogService), чтобы отделить UI от логики и упростить тестирование.
Ментальные модели и эвристики
- Ментальная модель: диалог — это синхронный запрос данных от пользователя, который блокирует вто́ричный поток (модально). Используйте модальные диалоги для обязательных данных, немодальные — для подсказок и дополнительных панелей.
- Эвристика: если форма содержит больше трёх полей, вероятно, стоит использовать отдельную форму с понятной вёрсткой и валидацией.
Чек-листы по ролям
Разработчик:
- Реализовать InputBox как переиспользуемую функцию/сервис.
- Локализовать все текстовые строки (заголовки, кнопки, подсказки).
- Проверить обработку пустой строки и длину ввода.
- Развернуть тестовую сборку и проверить DPI и разные темы Windows.
Тестировщик:
- Проверить поведение при нажатии Enter и Esc.
- Проверить на разных масштабах экрана и разрешениях.
- Проверить ввод специальных символов и длинных строк.
- Проверить доступность (Tab-порядок, экранные читалки).
Дизайнер/UX:
- Убедиться, что текст подсказки ясен и краток.
- Предложить валидацию с поясняющей ошибкой в диалоге.
- Проверить соответствие визуального стиля приложения и диалога.
Критерии приёмки
- Диалог открывается по клику на кнопку и центрируется на экране.
- При нажатии OK введённое значение возвращается в вызывающий код и отображается.
- При нажатии Отмена никаких изменений не происходит.
- Диалог корректно работает при масштабировании DPI и не выходит за пределы экрана.
- Все пользовательские строки локализованы.
Примеры тест-кейсов
- Ввод валидного имени, нажать OK — имя отобразится.
- Оставить поле пустым, нажать OK — приложение должно корректно отобразить пустую строку или показать сообщение (в зависимости от требований).
- Нажать Отмена — метка остаётся скрытой.
- Ввести очень длинную строку — проверить, что она правильно сохраняется и не ломает интерфейс.
- Нажать Enter — диалог должен принять значение (если кнопка OK назначена как AcceptButton).
Тонкие места и распространённые проблемы (и их решения)
- Проблема: текст обрезается или элементы выходят за границы при высоком DPI. Решение: используйте TableLayoutPanel, Anchor/Dock и тестируйте при разных масштабах.
- Проблема: диалог не возвращает введённое значение. Решение: убедитесь, что вы записываете value = textBox.Text ДО возврата DialogResult.
- Проблема: некорректная локализация кнопок и подсказок. Решение: вынесите строки в ресурсные файлы (.resx) и загружайте по культуре.
Локализация и доступность
- Переводите все тексты в .resx — это упростит поддержку нескольких языков.
- Для русской локали краткость подсказок часто важнее, чем буквальная калька с английского.
- Проверяйте порядок табуляции и подписи для экранных читалок (AccessibleName, AccessibleDescription).
Безопасность и приватность
- Не храните чувствительные данные в открытом виде в простых текстовых полях. Для паролей используйте TextBox с PasswordChar.
- Если диалог собирает персональные данные, убедитесь, что приложение соответствует внутренним требованиям конфиденциальности и регуляциям.
Когда этот подход не подходит
- Если вам нужен асинхронный UX (неблокирующий ввод) — используйте немодальные окна или панель внутри основного окна.
- Для сложных форм с несколькими шагами лучше использовать отдельную форму с навигацией (wizard) или модульную страницу.
Мини-методология внедрения
- Написать и протестировать простую функцию InputBox.
- Вынести тексты в ресурсы и локализовать.
- Заменить программную расстановку контролов на TableLayoutPanel при необходимости адаптивности.
- Добавить юнит/интеграционные тесты для сервисов, которые запускают диалоги (через интерфейс-обёртку).
Краткая сводка
- Создание диалога ввода в WinForms состоит из: создания Form, добавления Label/TextBox/кнопок и показа формы методом ShowDialog().
- Для продакшн-кода рекомендуются: локализация, адаптивная вёрстка, обработка ошибок и доступность.
Ключевые моменты:
- Используйте модальность для обязательных данных.
- Для сложной логики выносите диалог в отдельный класс/файл с дизайнером.
- Тестируйте интерфейс при разных масштабах и локалях.
Спасибо за внимание — теперь у вас есть рабочая InputBox-функция и набор практических рекомендаций для интеграции в проект.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента