Главная » WPF » Окна WPF

0

В библиотеке  User32  оно называлось  HWND, в Microsoft  Foundation Classes (MFC) – CWnd,  а в Windows Forms – Form. Но как ни называй, а в большинстве систем для построения  пользовательских интерфейсов необходим визуальный элемент верхнего уровня, которым могут манипулировать конечные пользовате# ли. В WPF такой элемент называется Window.

Базовым  типом всех окон в WPF является System.Windows.Window. Обычно тип Window применяется для SDI#окон и диалогов. По существу, Window – это просто элемент  управления, предназначенный служить  контейнером для содер# жимого верхнего уровня.  Как правило,  окно определяется с помощью комбина# ции разметки  и кода:

<!— Window1.xaml —>

<Window … x:Class=’EssentialWPF.Window1’ Visibility=’Visible’ Title=’This is a Window!’

</Window>

// Window1.cs

namespace EssentialWPF {

public partial class Window1 : Window {

public Window1() { InitializeComponent();

}

}

}

При запуске этой программы  появится ничем не примечательное окно, изоб#

раженное на рис. 2.10.

Отметим, что в жизни даже такого простого окна есть много этапов. Вот самые важные из них:

Вызывается конструктор.

Возбуждается событие Window.Initialized. Возбуждается событие Window.Activated13. Возбуждается событие Window.Loaded. Возбуждается событие Window.ContentRendered. Пользователь взаимодействует с окном. Возбуждается событие Window.Closing. Возбуждается событие Window.Unloaded.

Возбуждается событие Window.Closed.

Рис. 2.12. Отображение окна с заданием свойства Owner

У окон, имеющих владельца, есть еще ряд особенностей.  Они не появляются в списке окон, который отображается при нажатии комбинации клавиш Alt+Tab, хо# тя могут показываться на панели задач. Кроме того, они автоматически закрывают# ся при закрытии окна#владельца и скрываются, когда окно#владелец свертывается.

Задание размера и положения

Разобравшись с тем, как отобразить  окно, посмотрим, как управлять его поло# жением на экране. Существует  три основных способа задать размер и положение окна: начальное поведение, взаимодействие с пользователем и текущие значения.

У начального поведения есть два аспекта: в каком месте экрана расположить ок# но и какой размер для него выбрать. Начальное положение определяется свойством WindowStartupLocation в сочетании со свойствами Top и Left. Размер же контроли# руется свойствами  SizeToContent, Width и Height. Свойство  SizeToContent прини# мается во внимание  только, если и Width, и Height  равны Double.NaN  (автомати# ческий выбор), и пользователь не изменил  размер окна.

После того как желаемое положение  и размеры окна заданы, что может делать с окном  пользователь? Возможности взаимодействия определяются свойством ResizeMode, от него зависит, может ли пользователь вообще изменять  размер ок# на. Кроме того, свойства MinWidth, MaxWidth, MinHeight и MaxHeight опреде# ляют предельные ширину и высоту окна. Так, в следующем примере окно нельзя сделать уже 500 пикселей,  поэтому содержимое  всегда можно будет прочесть.

<Window …

Title=’EssentialWPF’

MinWidth=’500’

</Window>

Наконец,  получить или изменить  текущие значения  положения и размера ок# на можно с помощью свойств Width, Height,  Top и Left. Изменение размера окна тесно связано с размещением  элементов  внутри него, но эту тему мы отложим до главы 4.

Пользователи ожидают от окон конкретного стиля определенного поведения: размера, начального  положения и наличия  владельца.  Так, подразумевается, что диалоговое окно отображается с помощью примерно  такого кода:

void ShowDialogMethod(object sender, RoutedEventArgs e) { Window w = new Window();

w.Title = «ShowDialog»;

w.Owner = this;

w.SizeToContent = SizeToContent.WidthAndHeight; w.WindowStartupLocation = WindowStartupLocation.CenterOwner; w.ShowInTaskbar = false;

w.ShowDialog();

}

Здесь  говорится,  что окно  центрируется относительно своего  владельца,  не показывается на панели  задач и автоматически подстраивает  размер  под содер# жимое.

Объекты Window и Application

После того как окно (или несколько окон) показаны на экране, нам часто бы# вает нужно найти все открытые  окна. Как правило, приложения с несколькими окнами  верхнего  уровня   (например,  Microsoft   Office  Word   2003)  содержат пункт меню Window, позволяющий переходить  от одного открытого  докумен# та к другому. Реализовать это можно было бы, заведя глобальную  переменную# список, в который окно добавляется в момент создания  и удаляется  при закры# тии. Однако команда WPF решила встроить  эту возможность в объект Application,  которому автоматически посылается  уведомление  о создании и закрытии окна.

Таблица 2.3. Поведение при завершении приложения

ShutdownMode

Поведение

Типичное  применение

OnLastWindowClose

(по умолчанию)

Приложение завершается, когда открытых  окон не осталось. Каждое созданное окно добавляется в список

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

SDI#приложения с несколькими окнами верхнего уровня, например, Microsoft  Internet Explorer.

OnMainWindowClose

Приложение завершается, когда закрывается окно, присвоенное  свойству MainWindow приложения.

SDI#приложения с главным окном, например, приложение с одним окном документа

и набором плавающих  окон

с инструментами (как Adobe

Photoshop).

OnExplicitShutdown

Приложение завершается только после того, как

в программе явно вызван метод ShutDown.

Любой сценарий, в котором реализована нестандартная логика завершения приложения. Например, в приложении может вообще не быть открытых  окон,

а его присутствие обозначается значком в системном лотке (как в случае MSN Messenger).

Поскольку объекту  Application  посылаются уведомления обо всех окнах, он может сам завершить  приложение после закрытия последнего окна (или по дру# гим причинам). Иногда метод Shutdown вызывается автоматически в зависимос# ти от значения  свойства ShutdownMode объекта Application.  В табл. 2.3 перечис# лены возможные  значения  этого свойства.

Перебрать все открытые в данный момент окна позволяет  свойство Application.Windows. Для  иллюстрации создадим  окно с двумя  кнопками.  Пер# вая кнопка создает новое окно, вторая выводит список всех открытых  окон:

<!— WindowList.xaml —>

<Window … x:Class=’EssentialWPF.WindowList’ Title=’Window List’ SizeToContent=’WidthAndHeight’

<StackPanel>

<Button Click=’NewWindowClicked’>Create New Window</Button>

<Button Click=’ListOpenWindows’>List Open Windows</Button>

</StackPanel>

</Window>

Чтобы не было сомнений  в том, что мы создаем несколько  окон, заведем ста# тическую  переменную  и будем увеличивать ее на единицу, так чтобы заголовки всех окон  различались. В обработчике  события  NewWindowClicked мы можем просто создать и показать новое окно:

// WindowList.xaml.cs

public partial class WindowList : Window {

static int _createCount;

public WindowList() { InitializeComponent();

Title = «Window List « + _createCount;

_createCount++;

}

void NewWindowClicked(object sender, RoutedEventArgs e) {

new WindowList().Show();

}

}

А в обработчике события ListOpenWindows мы можем обойти весь набор окон в объекте Application  и построить  строку, содержащую их заголовки.  При запус# ке программа ведет себя, как показано на рис. 2.13:

void ListOpenWindows(object sender, RoutedEventArgs e) { StringBuilder sb = new StringBuilder();

foreach (Window openWindow in Application.Current.Windows) {

sb.AppendLine(openWindow.Title);

}

MessageBox.Show(sb.ToString(), «Open Windows»);

}

Источник: К. Андерсон  Основы  Windows Presentation Foundation. Пер. с англ. А. Слинкина — М.: ДМК Пресс, 2008 — 432 с.: ил.

По теме:

  • Комментарии