Ключевым элементом в системе графического интерфейса в WPF является окно, которое содержит все необходимые элементы управления. Окно в WPF представлено классом Window, который является производным от класса ContentControl. Поэтому окно является элементом управления содержимым, и как, к примеру, кнопка, может содержать в себе один дочерний элемент. Как правило, в его качестве выступает один из элементов компоновки, например, Grid.
Класс Window привносит ряд свойств, которые позволяют настроить окно приложения:
AllowsTransparency: при значении true
позволяет установить прозрачный фон окна
Icon: представляет иконку, которая отображается в левом верхнем углу окна и в панели задач. Если иконка не установлена, то система будет использовать стандартную иконку по умолчанию.
Top: устанавливает отступ окна приложения от верхней границы экрана
Left: устанавливает отступ окна приложения от левой границы экрана
ResizeMode: задает режим изменения размеров окна. Может принимать следующие значения:
CanMinimize
: окно можно только свернуть
NoResize
: у окна нельзя изменить начальные размеры
CanResize
: у окна можно изменять размеры
CanResizeWithGrip
: в правом нижнем углу окна появляется визуализация того, что у окна можно изменять размеры
RestoreBounds: возвращает границы окна
ShowInTaskbar: при значении true
иконка окна отображается на панели задач
SizeToContent: позволяет автоматически масштабировать размеры окна в зависимости от содержимого. Может принимать следующие значения:
Width
: автоматически масштабируется только ширина
Height
: автоматически масштабируется только высота
WidthAndHeight
: автоматически масштабируются высота и ширина
Manual
: автоматическое масштабирование отсутствует
Title: заголовок окна
Topmost: при значении true
окно устанавливается поверх других окон приложения
WindowStartupLocation: устанавливает стартовую позицию окна. Может принимать следующие значения:
CenterOwner
: если данное окно было запущено другим окном, то данное окно позиционируется относительно центра запустившего его окна
CenterScreen
: окно помещается в центре экрана
Manual
: позиция устанавливается вручную с помощью свойств Top и Left
WindowState: состояние окна. Возможные значения:
Maximized
: раскрыто на весь экран
Minimized
: свернуто
Normal
: стандартное состояние
В процессе работы окно в WPF проходит ряд этапов жизненного цикла, которые доступны нам через обработку событий класса Window:
Initialized: это событие возникает при инициализации окна, когда у него устанавливаются все свойства, но до применения к нему стилей и привязки данных. Это общее событие для всех элементов управления в WPF, поэтому следует учитывать, что сначала возникают события вложенных элементов, а затем их контейнеров. То есть событие Initialized окна приложения генерируется только после того, как отработает событие Initialized для всех вложенных элементов.
Loaded: возникает после полной инициализации окна и применения к нему стилей и привязки данных. После генерации этого события происходит визуализация элемента, и окно отображается на экране и становится видимым для пользователя
Closing: возникает при закрытии окна
Closed: возникает, когда окно становится закрытым
Unloaded: возникает после закрытия окна при выгрузке всех связанных ресурсов из памяти
Соответственно, если нам надо выполнить некоторые действия при загрузке или при закрытии окна, мы можем обработать события Loaded и Closing/Closed. Например, запишем в текстовый лог события жизненного цикла:
using System; using System.Windows; using System.Windows.Media; using System.IO; namespace WindowApp { public partial class MainWindow : Window { string path = "log.txt"; public MainWindow() { InitializeComponent(); this.Loaded += MainWindow_Loaded; this.Closing += MainWindow_Closing; this.Closed += MainWindow_Closed; } private void MainWindow_Loaded(object sender, RoutedEventArgs e) { Log("Loaded"); } private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) { Log("Closing"); } private void MainWindow_Closed(object sender, EventArgs e) { Log("Closed"); } private void Log(string eventName) { using (StreamWriter logger = new StreamWriter(path, true)) { logger.WriteLine(DateTime.Now.ToLongTimeString() + " - " + eventName); } } } }