Литмир - Электронная Библиотека
A
A

private void App_OnStartup(object sender, StartupEventArgs e)

{

  Application.Current.Properties["GodMode"] = false;

  // Проверить входные аргументы командной строки

  // на предмет наличия флага /GODMODE.

  foreach (string arg in e.Args)

  {

    if (arg.Equals("/godmode",StringComparison.OrdinalIgnoreCase))

    {

      Application.Current.Properties["GodMode"] = true;

      break;

    }

  }

}

Данные уровня приложения доступны из любого места внутри приложения WPF. Для обращения к ним потребуется лишь получить точку доступа к глобальному объекту приложения (через

Application.Current
) и просмотреть коллекцию. Например, обработчик события
Click
для кнопки можно было бы изменить следующим образом:

private void Button_Click(object sender, RoutedEventArgs e)

{

  // Указал ли пользователь /godmode?

  if ((bool)Application.Current.Properties["GodMode"])

  {

    MessageBox.Show("Cheater!");  // Мошенник!

  }

}

Если теперь ввести аргумент командной строки

/godmode
на вкладке Debug (Отладка) в окне свойств проекта и запустить программу, то отобразится окно сообщения и программа завершится. Можно также запустить программу из командной строки с помощью показанной ниже команды (предварительно открыв окно командной строки и перейдя в каталог
bin/debug
):

WpfAppAllCode.exe /godmode

Отобразится окно сообщения и программа завершится.

На заметку! Вспомните, что аргументы командной строки можно указывать внутри Visual Studio. Нужно просто дважды щелкнуть на значке Properties (Свойства) в окне Solution Explorer, в открывшемся диалоговом окне перейти на вкладку Debug (Отладка) и ввести

/godmode
в поле Command line arguments (Аргументы командной строки).

Обработка закрытия объекта Window

Конечные пользователи могут завершать работу окна с помощью многочисленных встроенных приемов уровня системы (например, щелкнув на кнопке закрытия X внутри рамки окна) или вызвав метод

Close()
в ответ на некоторое действие с интерактивным элементом (скажем, выбор пункта меню File Exit (Файл Выход)). Инфраструктура WPF предлагает два события, которые можно перехватывать для выяснения, действительно ли пользователь намерен закрыть окно и удалить его из памяти. Первое такое событие —
Closing
, которое работает в сочетании с делегатом
CancelEventHandler
.

Указанный делегат ожидает целевые методы, принимающие тип

System.ComponentModel.CancelEventArgs
во втором параметре. Класс
CancelEventArgs
предоставляет свойство
Cancel
, установка которого в
true
предотвращает фактическое закрытие окна (что удобно, когда пользователю должен быть задан вопрос о том, на самом ли деле он желает закрыть окно или сначала нужно сохранить результаты проделанной работы). Если пользователь действительно хочет закрыть окно, тогда свойство
CancelEventArgs.Cancel
можно установить в
false
(стандартное значение). В итоге сгенерируется событие
Closed
(которое работает с делегатом
System.EventHandler
), представляющее собой точку, где окно полностью и безвозвратно готово к закрытию.

Модифицируйте класс

МаinWindow
для обработки упомянутых двух событий, добавив в текущий код конструктора такие операторы:

public MainWindow()

{

  InitializeComponent();

  this.Closed+=MainWindow_Closed;

  this.Closing += MainWindow_Closing;

}

Теперь реализуйте соответствующие обработчики событий:

private void MainWindow_Closing(object sender,

                                System.ComponentModel.CancelEventArgs e)

{

<b>  // Выяснить, на самом ли деле пользователь хочет закрыть окно.</b>

  string msg = &quot;Do you want to close without saving?&quot;;

  MessageBoxResult result = MessageBox.Show(msg,

    &quot;My App&quot;, MessageBoxButton.YesNo, MessageBoxImage.Warning);

  if (result == MessageBoxResult.No)

  {

<b>   // Если пользователь не желает закрывать окно, тогда отменить закрытие.</b>

    e.Cancel = true;

  }

}

private void MainWindow_Closed(object sender, EventArgs e)

{

  MessageBox.Show(&quot;See ya!&quot;);

}

Запустите программу и попробуйте закрыть окно, щелкнув либо на значке X в правом верхнем углу окна, либо на кнопке. Должно появиться диалоговое окно с запросом подтверждения. Щелчок на кнопке Yes (Да) приведет к отображению окна с прощальным сообщением, а щелчок на кнопке No (Нет) оставит окно в памяти.

Перехват событий мыши

Инфраструктура WPF предоставляет несколько событий, которые можно перехватывать, чтобы взаимодействовать с мышью. В частности, базовый класс

UIElement
определяет такие связанные с мышью события, как
MouseMove
,
MouseUp
,
MouseDown
,
MouseEnter
,
MouseLeave
и т.д.

488
{"b":"847442","o":1}