Гид по технологиям

Подтверждающий диалог в WinForms (C#)

6 min read Разработка Обновлено 02 Jan 2026
Подтверждающий диалог в WinForms (C#)
Подтверждающий диалог в WinForms (C#)

Руки печатают на ноутбуке

Введение

Подтверждающий диалог полезен, когда приложение должно получить явное согласие или подтверждение от пользователя — например, принятие условий, удаление данных или отмена операции. В WinForms можно создать кастомный диалог, который выглядит и ведёт себя так, как нужно вашему приложению.

Определение: DialogResult — перечисление (enum) в .NET, которое содержит результат диалога (Yes/No/Cancel/OK и др.).

Важно: диалоги блокируют взаимодействие с родительским окном, пока не будут закрыты (modal), поэтому используйте их экономно, особенно в многопоточном UI-сценарии.

Что вы получите в этой статье

  • Пошаговая инструкция по созданию диалога в WinForms.
  • Полный пример кода C# с локализованными текстами.
  • Рекомендации по дизайну, доступности и тестированию.
  • Альтернативы и когда не стоит использовать подтверждающие диалоги.
  • Чеклисты для разработчика и тестировщика, критерии приёмки и шаблоны.

Как добавить событие, которое вызовет подтверждающий диалог

Подтверждающий диалог должен срабатывать аналогично другим модальным окнам — по событию (клик по кнопке, переход этапа, попытка удаления и т. п.). Пример: создайте новое WinForms-приложение и добавьте кнопку-инициатор.

Шаги:

  1. Откройте Visual Studio и создайте новый проект Windows Forms.
  2. Перетащите кнопку из Toolbox на форму. Кнопка WinForms на холсте формы
  3. В окне свойств справа задайте параметры кнопки:
СвойствоЗначение
NametermsAndConditionsButton
Size400, 100
TextУсловия использования

Эта конфигурация даст кнопку со следующим видом: Окно свойств новой кнопки

  1. Добавьте метку (Label) на форму. Новая метка на холсте WinForms
  2. В окне свойств установите:
СвойствоЗначение
NameresponseLabel
TextВаш ответ:
VisibleFalse

В результате метка будет выглядеть так: Окно свойств метки

  1. Дважды щёлкните по кнопке «Условия использования» на форме. Visual Studio сгенерирует обработчик events — метод termsAndConditionsButton_Click(), который вызовется при клике.
private void termsAndConditionsButton_Click(object sender, EventArgs e)
{
    // Код, который выполнится при клике на кнопку "Условия использования"
}

Как отобразить подтверждающий диалог и получить ответ пользователя

Внутри termsAndConditionsButton_Click() вызовите функцию ConfirmationBox(ref userResponse), которая создаст форму диалога и вернёт DialogResult. Затем отобразите результат в responseLabel.

Пример шагов внутри обработчика:

  1. Определите возможные результаты (Yes/No/Cancel):
DialogResult[] results = { DialogResult.Yes, DialogResult.No, DialogResult.Cancel };
  1. Объявите переменную для хранения текстового ответа:
string userResponse = "";
  1. Показать диалог и проверить результат:
if (results.Contains(ConfirmationBox(ref userResponse)))
{
    responseLabel.Visible = true;
    responseLabel.Text = "Ваш ответ: " + userResponse;
}

Если ConfirmationBox вернёт одно из ожидаемых значений, метка станет видимой и покажет выбранный вариант.

Как сгенерировать кнопки Yes/No/Cancel и добавить их в окно диалога

Ниже — реализация функции ConfirmationBox. В примере тексты локализованы на русский язык, имена полей сохранены технически (Name остаётся на английском) для совместимости с существующим кодом.

public static DialogResult ConfirmationBox(ref string userResponse)
{
    Form form = new Form();
    form.Text = "Подтверждение";

    Label message = new Label();
    message.Text = "Вы соглашаетесь с условиями использования?";
    message.SetBounds(36, 36, 372, 13);
    message.AutoSize = true;

    Button buttonYes = new Button();
    buttonYes.Text = "Да";
    buttonYes.DialogResult = DialogResult.Yes;
    buttonYes.SetBounds(150, 160, 150, 60);
    buttonYes.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;

    Button buttonNo = new Button();
    buttonNo.Text = "Нет";
    buttonNo.DialogResult = DialogResult.No;
    buttonNo.SetBounds(310, 160, 150, 60);
    buttonNo.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;

    Button buttonCancel = new Button();
    buttonCancel.Text = "Отмена";
    buttonCancel.DialogResult = DialogResult.Cancel;
    buttonCancel.SetBounds(470, 160, 150, 60);
    buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;

    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[] { message, buttonYes, buttonNo, buttonCancel });

    form.AcceptButton = buttonYes;
    form.CancelButton = buttonCancel;

    DialogResult dialogResult = form.ShowDialog();

    if (dialogResult == DialogResult.Yes)
    {
        userResponse = "Да";
    }
    if (dialogResult == DialogResult.No)
    {
        userResponse = "Нет";
    }
    if (dialogResult == DialogResult.Cancel)
    {
        userResponse = "Отмена";
    }

    return dialogResult;
}

Примечания по коду:

  • form.AcceptButton и form.CancelButton обеспечивают быстрые клавиши Enter/Esc.
  • Anchor задаёт поведение кнопок при изменении размера формы. Здесь форма фиксированная (FixedDialog), но привязки остаются корректными.

Полный пример: объединение обработчика и диалога

Разместите следующий код в классе формы (Form1):

private void termsAndConditionsButton_Click(object sender, EventArgs e)
{
    DialogResult[] results = { DialogResult.Yes, DialogResult.No, DialogResult.Cancel };
    string userResponse = "";

    if (results.Contains(ConfirmationBox(ref userResponse)))
    {
        responseLabel.Visible = true;
        responseLabel.Text = "Ваш ответ: " + userResponse;
    }
}

public static DialogResult ConfirmationBox(ref string userResponse)
{
    // (реализация, как в предыдущем примере)
}

Убедитесь, что в файле подключены нужные пространства имён: System.Drawing, System.Windows.Forms.

Как запустить диалог

  1. Нажмите зелёную кнопку «Запуск» (Start) в Visual Studio и дождитесь компиляции. Кнопка запуска в Visual Studio
  2. Нажмите кнопку «Условия использования» в работающем приложении. Кнопка условий в приложении во время выполнения
  3. В появившемся диалоге выберите «Да», «Нет» или «Отмена». Подтверждающий диалог при выполнении приложения
  4. Посмотрите результат в основном окне. Отображение ответа в основном окне приложения

Дизайн, доступность и локализация

  • Локализуйте текст диалога на язык целевой аудитории (кнопки, подсказки, сообщения об ошибке).
  • Используйте понятные короткие фразы: “Вы уверены?”, “Удалить навсегда?”.
  • Добавьте доступность: подходящий TabIndex для контроля фокуса, доступные названия (AccessibleName/AccessibleDescription) для экранных читалок.
  • Избегайте слишком больших модальных диалогов: укажите четкую цель и действия.

Совет: для критичных операций добавляйте подтверждение с дополнительным пояснением (почему действие необратимо) и, при необходимости, поле для ввода подтверждающего текста (например, ввести слово “удалить”).

Когда не стоит использовать модальный подтверждающий диалог (контрпримеры)

  • Частые подтверждения для недолгих или обратимых действий утомляют пользователя. Вместо них используйте Snackbar/Undo (отмена операции).
  • Для массовых операций — показывайте единый обзор с возможностью отмены, а не поштучные диалоги.
  • Для прогресса или статусов — используйте неблокирующие уведомления.

Альтернативные подходы

  1. Неблокирующее подтверждение с кнопкой “Отменить” (Undo) в шторке уведомлений.
  2. Инлайн-подтверждение: показывать компактную панель с “Подтвердить”/“Отменить” в контексте элемента.
  3. Дополнительный экран «Подтвердите действие» для мобильных/адаптивных интерфейсов.

Модель принятия решения (mental model)

  • Цель диалога: явно получить пользовательское согласие (Stop -> Confirm -> Act).
  • Критерии: понятность, минимальное размытие контекста, возможность быстрого отказа.

Mermaid-схема (простое дерево решений):

flowchart TD
  A[Пользователь инициирует действие] --> B{Требуется подтверждение?}
  B -- Да --> C[Показать подтверждающий диалог]
  C --> D{Выбор}
  D -- Да --> E[Выполнить действие]
  D -- Нет --> F[Отменить действие]
  D -- Отмена --> G[Закрыть диалог]
  B -- Нет --> E

Чеклисты (роль-базированные)

Разработчик:

  • Проверить корректность DialogResult.
  • Локализовать UI-строки.
  • Установить AcceptButton и CancelButton.
  • Настроить AccessibleName и AccessibleDescription.

Тестировщик:

  • Убедиться, что Enter выбирает «Да», Esc — «Отмена».
  • Проверить поведение при быстром многократном клике.
  • Проверить фокусировка TabIndex и навигацию с клавиатуры.

Продакт/Дизайнер:

  • Соответствуют ли тексты стилю продукта?
  • Ясна ли причина подтверждения для пользователя?

Критерии приёмки

  • Диалог отображается при клике на кнопку-инициатор.
  • При нажатии “Да/Нет/Отмена” возвращается соответствующий DialogResult.
  • responseLabel показывает корректную строку ответа.
  • Enter и Esc работают как ожидается.
  • Элементы доступны для экранных читалок.

Тест-кейсы / Приёмо-сдача

  1. Нормальный поток: нажать “Условия использования” → диалог показан → нажать “Да” → метка показывает “Ваш ответ: Да”.
  2. Нажать “Отмена” → диалог закрыт, метка показывает “Ваш ответ: Отмена”.
  3. Нажать Enter → эквивалент нажатия “Да”.
  4. Нажать Esc → эквивалент нажатия “Отмена”.
  5. Быстро нажать кнопку-инициатор 10 раз → приложение не падает, отображается один диалог.

Советы по безопасности и приватности

  • Не используйте модальные диалоги для сбора чувствительных данных без TLS/шифрования при передаче.
  • Не храните в тексте диалога персональные данные без явного согласия пользователя.

Совместимость и миграция

  • Код выше работает в классических .NET Framework WinForms и .NET (Core/5/6/7) при наличии пакета System.Windows.Forms.
  • При миграции UI на WPF или MAUI рекомендуется адаптировать шаблон диалога под UI-фреймворк (WPF использует Window.ShowDialog()).

Отладка и распространённые проблемы

  • Проблема: диалог появляется слишком маленьким или обрезанным — решение: проверьте ClientSize и AutoSize/AutoScaleMode.
  • Проблема: Enter не срабатывает — решение: убедитесь, что form.AcceptButton задан и фокус в пределах формы.
  • Проблема: несколько диалогов одновременно — решение: отключите кнопку-инициатор на время выполнения или используйте флаг isDialogOpen.

Шаблон проверки локализации (SOP)

  1. Собрать список всех строк в диалогах.
  2. Передать переводчикам и получить переводы.
  3. Проверить длину строк (чтобы элементы не выходили за границы).
  4. Тестировать клавиатурную навигацию для локализации с разными раскладками.

Небольшая галерея крайних случаев

  • Диалог с дополнительным полем ввода для подтверждения критичных операций.
  • Диалог с чекбоксом “Больше не показывать” (требует сохранения состояния).
  • Блокирующий экран при длительных операциях с прогресс-баром вместо простого подтверждения.

1-строчный глоссарий

  • DialogResult: результат модального окна (Yes/No/Cancel/OK и др.).
  • Modal: блокирующее окно, блокирует родительский интерфейс.

Короткое резюме

Подтверждающие диалоги в WinForms легко создавать и настраивать: достаточно программно сформировать форму, добавить сообщение и кнопки с нужными DialogResult. Локализация, доступность и минимизация числа модальных окон — ключевые аспекты хорошего UX.

Важно: выбирайте альтернативы (Undo, inline-confirm) когда подтверждения мешают основному потоку работы пользователя.


Если нужно, могу: предоставить полностью готовый проектный файл Form1.cs с namespace и using-директивами; адаптировать тексты на другой язык; или предложить стили оформления диалога в соответствии с корпоративным дизайном.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как извиниться подарком — идеи и стратегия
Подарки

Как извиниться подарком — идеи и стратегия

Как исправить ошибку YouTube Playback ID
Техподдержка

Как исправить ошибку YouTube Playback ID

Как искать видео внутри канала YouTube
Руководство

Как искать видео внутри канала YouTube

YouTube Emotes — как пользоваться новыми эмотами
Social

YouTube Emotes — как пользоваться новыми эмотами

Как убрать заикание звука на YouTube — полное руководство
Техподдержка

Как убрать заикание звука на YouTube — полное руководство

Как исправить ошибку Audio renderer на YouTube в Windows
Техподдержка

Как исправить ошибку Audio renderer на YouTube в Windows