Главная » Silverlight » Дочернее окно

0

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

В Silverlight создать временное диалоговое окно легче всего с помощью элемента управления ChildWindow. Он имитирует модальное диалоговое окно. При выводе дочер­него окна остальные окна отключаются и затеняются, в результате чего пользователь видит, что с ними сейчас нельзя работать. Затем дочернее окно выводится в центре экрана. Когда пользователь заканчивает работать с дочерним окном, ваш код закрыва­ет его и делает активными остальные части приложения.

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

Рис. 7.3. Вывод дочернего окна

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

Объект ChildWindow имитирует отдельное модальное окно, выводимое на фоне при­ложения, однако фактически оно является элементом управления, добавленным на существующую страницу. При его выводе остальное содержимое корневого визуаль­ного элемента становится недоступным и затеняется. Однако затененный интерфейс остается активным, несмотря даже на то, что пользователь не может взаимодейство­вать с ним. Например, если в нижележащем интерфейсе выполняется анимация или видеофайл, они продолжают выполняться в качестве фона дочернего окна (если, конеч­но, не остановить их явно).

Примечание. Элемент управления ChildWindow всегда блокирует главный интерфейс пользователя. Если такое поведение нежелательно, примените элемент FloatableWindow, который не делает этого. Его можно найти в Silverlight Toolkit (www. codeplex. com/Silverlight). Элемент FloatableWindow можно применить для вывода одного или нескольких окон на фоне главной страницы Silverlight, причем, когда он активен, пользователь может взаимодействовать с нижележащим приложением. Обычно окно FloatableWindow используется для создания окон сообщений, плавающих панелей инструментов и областей, предназначенных для решения отдельных задач. Однако учитывайте, что плавающее окно может сбивать с толку пользователей.

Создание дочернего окна

Чтобы вывести элемент ChildWindow, его нужно создать на основе шаблона XAML так же, как любой другой пользовательский элемент управления. Для получения заго­товки элемента ChildWindow в Visual Studio щелкните правой кнопкой мыши на имени проекта в окне Solution Explorer (Проводник решений) и выберите в контекстном меню команду Add New Item (Добавить Новый элемент). Выделите шаблон Silverlight Child Window ( Silverlight), введите имя и щелкните на кнопке Add. Будут авто­матически созданы шаблон XAML и файл с фоновым кодом. Кроме того, в проект будет добавлена ссылка на сборку System.Windows.Control.dll, в которой определен эле­мент ChildWindow.

Примечание. Класс ChildWindow наследует класс ContentControl, добавляя в него два дополнительных свойства (Title и DialogResult), два метода (Show и Close) и два события (Closing и Closed).

После добавления дочернего окна нужно заполнить его. Рабочая среда Visual Studio автоматически создает в шаблоне дочернего окна решетку Grid с двумя строками, раз­мещает в нижней строке кнопки ОК и Cancel (Отмена) и создает обработчики событий, закрывающие окно. Вы можете удалить или отредактировать любые элементы, создан­ные программой Visual Studio.

Ниже приведена разметка дочернего окна, показанного на рис. 7.3. Оно отобража­ет две стандартные кнопки (ОК и Cancel) и два текстовых поля для ввода информации пользователем.

Ccontrols:ChildWindow х: Class="Navigation.UserInformation" xmlns="http://schemas.microsoft.com/winfx/200б/хаті/

presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls= "clr-namespace:System.Windows.Controls;assembly» System.Windows.Controls" Title="UserInformation"> <Grid x:Name="LayoutRoot" Margin="2"> <Grid.RowDefinitions> <RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinitionx/ColumnDefinition> <ColumnDefinitionx/ColumnDefinition> </Grid.ColumnDefinitions>

<TextBlock>hmh:</TextBlock>

<TextBox x:Name="txtFirstName" Grid.Column="l"

Margin»';3" Width=" 150"></TextBOx><TextBlock Grid.Row="1">Фамилия:</TextBlock> <TextBox x:Name="txtLastName" Grid.Row="l"

Grid. Column=" 1" Margin="3">< /TextBox>

<Button Grid.Row="2" Margin="3" Width="75" Height="23" HorizontalAlignment="Right" Content="OK" Click="cmdOK_Click"></Button>

<Button Grid.Row="2" Grid.Column="1" Margin="3" Width="75" Height="23"

HorizontalAlignment="Left" Content="OTMeHa" Click="cmdCancel_Click"></Button>

</Grid>

</controls :ChildWindow>

Обработчики событий двух кнопок устанавливают свойство ChildWindow. DialogResult булева типа. При щелчке на кнопке ОК оно принимает значение true, а на кнопке Cancel — значение false. Кроме того, свойство DialogResult может иметь значение null, указывающее на то, что пользователь не щелкнул ни на одной кнопке.

private void cmdOK_Click(object sender, RoutedEventArgs e)

{

this.DialogResult = true;

}

private void cmdCancel_Click (object sender, RoutedEventArgs e)

{

this.DialogResult = false;

}

При установке свойства DialogResult окно автоматически закрывается, возвра­щая управление корневому визуальному элементу. В некоторых ситуациях свойство DialogResult неуместно (например, при выводе окна About, содержащего только кнопку Close). В этих случаях можно закрыть окно с помощью метода ChildWindow.Close (), а не путем установки свойства DialogResult.

Отображение дочернего окна

Для вывода дочернего окна на экран нужно создать экземпляр пользовательского класса ChildWindow и вызвать метод Show ().

Userlnformation ChildWindow = new Userlnformation();

ChildWindow.Show();

Несмотря на то что дочернее окно блокирует главный пользовательский интерфейс, метод Show () не блокирует выполнение кода приложения. Если поместить код после вызова метода Show (), он будет выполнен немедленно.

Такое поведение может привести к проблемам, если нужно создать реакцию на за­крытие дочернего окна пользователем. В примере, показанном на рис. 7.3, приложение получает информацию, введенную пользователем в дочернем окне, и применяет ее для обновления главной страницы. Для реализации этой задачи код должен реагировать на событие ChildWindow. Closed. Класс ChildWindow предоставляет также событие Closing, которое генерируется перед закрытием окна; обычно оно используется для от­мены закрытия, например, если введенной информации недостаточно.

Следовательно, обработчик события Closed нужно подключить до вызова метода Show () и отображения дочернего окна.

Userlnformation ChildWindow = new Userlnformation();

ChildWindow.Closed += childWindow_Closed;

ChildWindow.Show();

Иногда дочернее окно довольно сложное, и в приложение нужно возвратить допол­нительную информацию. В данном примере (см. рис. 7.3) дополнительная информация содержит имя и фамилию пользователя. В принципе, код приложения может получить объект ChildWindow и найти в нем информацию соответствующих элементов управле­ния. Однако такое взаимодействие не надежное. Оно жестко связывает главную стра- ницу с дочерним окном, причем взаимосвязь не всегда очевидна и о ней легко забыть. Если изменить приложение (например, поменять местами имя и фамилию), код срабо­тает неправильно. Намного лучше создать дополнительный слой на основе открытых свойств и методов дочернего окна. Піавная страница приложения может обратиться к свойствам и методам для получения необходимой информации. Указанные свойства и методы принадлежат пользовательскому классу ChildWindow, поэтому при корректи­ровке интерфейса дочернего окна они сами напомнят о себе.

Например, в текущем примере можно добавить свойство UserName в класс Userlnformation для возвращения имени и фамилии в одной строке.

public string UserName

{

get { return txtFirstName.Text + " " + txtLastName.Text; }

}

Теперь имя и фамилию можно получить в обработчике события Closed.

private void childWindow_Closed(object sender, EventArgs e)

{

Userlnformation ChildWindow = (Userlnformation)sender;

if (ChildWindow.DialogResult == true)

{

lbllnfo.Text = "Добро пожаловать в приложение, " + ChildWindow.UserName + "!";

}

}

Пример можно немного улучшить. Сейчас дочернее окно создается при каждом щелчке на кнопке Ввод информации (см. рис. 7.3). В результате текстовые поля, предна­значенные для ввода имени и фамилии, всегда появляются пустыми, даже если пользо­ватель вводил в них информацию при предыдущей активизации окна. Для устранения этого недостатка можно добавить процедуру установки свойства UserName. Но есть еще лучший способ: сохранить объект Userlnformation в памяти. В следующем коде объект ChildWindow создается один раз как переменная главной страницы.

private Userlnformation ChildWindow = new Userlnformation();

Обработчик подключается к событию в конструкторе страницы.

public ShowChildWindowO

{

InitializeComponent();

ChildWindow.Closed += childWindow_Closed;

}

Теперь объект Userlnformation будет сам сохранять свое состояние. В результате при каждом открытии дочернего окна введенная до этого информация появится в тек­стовых полях.

Совет. Окно ChildWindow — прекрасное средство, но не следует злоупотреблять им. Для неопытных пользователей удобнее, когда вся работа выполняется в одном месте. Всплывающие окна сбивают их с толку, потому что заставляют оставить среду, к которой они начали привыкать, и, к тому же, закрывают нужную информацию. Вы не ошибетесь, если будете считать, что все ваши пользователи относятся к категории неопытных, потому что посетители веб-страниц не изучают веб-приложения так же глубоко и систематически, как пользователи настольных приложений. Для посетителя ваше приложение — скорее всего, лишь одна из десятков страниц, мелькнувших у него перед глазами за последние полчаса.

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

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