Существует ли команда Close для диалоговых окон в инфраструктуре команд WPF? - PullRequest
4 голосов
/ 22 июня 2010

Должен ли я использовать ApplicationCommands.Close для закрытия модальных диалоговых окон или эта команда считается зарезервированной для закрытия приложения?Если это последнее, люди создают команды Close для каждого поля Dialog или просто одну команду Close для всех своих модальных диалоговых окон?

Ответы [ 3 ]

3 голосов
/ 28 января 2015

Если вы просто хотите связать нажатие кнопки, чтобы закрыть диалоговое окно, вы можете установить свойство IsCancel для кнопки , как рекомендовано в документации :

<Button IsCancel="True">Cancel</Button>

Когда вы щелкните по нему, он закроет диалоговое окно с результатом false.Если вы хотите закрыть результат с true, один очень простой способ - добавить обработчик кликов и написать две (2) строки кода.Ваш XAML:

<Button IsDefault="True" Click="acceptButton_Click">OK</Button>

и код:

void acceptButton_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = true;
}

Этот закроет диалоговое окно и вернет результат true.

Так как это код представления (закройте окно), этот кодовый отстойник обычно не вызывает у меня никакой строгости в моих строгих архитектурах MVVM.YDMV.

3 голосов
/ 22 июня 2010

Вот как WPF использует ApplicationCommand.Close:

  1. Сам WPF не имеет встроенного обработчика команд для ApplicationCommands.Close, но
  2. WPF выполняет ApplicationCommand.Close RoutedCommand всякий раз, когда онполучает сообщение Win32 WM_APPCOMMAND с lParam=APPCOMMAND_CLOSE.Это означает, что если любое приложение Win32 отправит вам APPCOMMAND_CLOSE, будет вызван ваш обработчик ApplicationCommand.Close.

Документация для APPCOMMAND_CLOSE дает следующее определение:

Закройте окно (не приложение).

Я бы предположил, что приложения WPF должны обрабатывать ApplicationCommand.Close так же, и что «окно» будет включать диалоговые окна (как правило, в мире Win32).

Почему вас волнует, что написано в документации Win32?Это может быть важно в трех ситуациях:

  1. Сценарии доступа
  2. Клавиатуры с клавишей «Закрыть окно»
  3. Когда пользователь настроил комбинацию кнопок мышичтобы отправить команду «закрыть окно»

Итак, чтобы ответить на ваш вопрос: Нет, ApplicationCommand.Close is not зарезервировано для закрытия приложения.Его цель - закрыть окно, в том числе диалоговое окно.Поэтому нет необходимости создавать отдельные команды для закрытия диалоговых окон.

Многие приложения просто используют стиль в App.xaml для установки CommandBinding класса thw Window, и в обработчике они заканчиваются вызовом ((Window)sender).Close(),Это простое и элегантное решение.

1 голос
/ 16 февраля 2011

Закрытие приложения отличается от закрытия диалога.

Существует встроенная команда для закрытия диалогов. В верхней части любого класса Window, который вы создаете, есть большой красный крестик. Когда вы нажимаете «X», вы генерируете «DialogCancelCommand», который затем обрабатывается обработчиком события «OnDialogCancel» внутри класса Window. Однако по причинам, которые известны только внутри Redmond, DialogCancelCommand является внутренним RoutedEvent. Я не могу говорить за других инженеров, но я воспроизвел 'DialogCancelCommand' из Отраженного кода, чтобы я мог закрывать диалоговые окна идентично тому, как внутренние команды выполняют ту же операцию.

    /// <summary>
    /// Cancels a dialog.
    /// </summary>
    public static readonly RoutedCommand DialogCancelCommand = new RoutedCommand("DialogCancel", typeof(CoreCommands));
...