Использование PageFunction для создания WPF диалогов

PageFunction это новый термин, определенный в WPF. PageFunction позволяет пользователю переходить на определенную страницу и выполнять на ней необходимые действия и затем возвращаться назад к исходной странице возвращая некоторый результат. Это работает наподобие модальных диалоговых окон с тем отличием, что PageFunction не будет отображаться в виде отдельного окна а использует то же самое пространство, которое до этого занимала вызвавшая ее страница.

Другая приятная особенность PageFunction – ее вызов не будет включен в историю навигации, делая процесс навигации более простым как для пользователя так и для разработчика.

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

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

<Grid DockPanel.Dock="Top">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="0.3*" />
        <ColumnDefinition Width="0.4*" />
        <ColumnDefinition Width="0.3*" />
    </Grid.ColumnDefinitions>
    <TextBlock Grid.Row="0" Grid.Column="0">Selected Name:</TextBlock>
    <TextBox Grid.Row="0" Grid.Column="1" Name="txtResult" ></TextBox>
    <TextBlock Grid.Row="0" Grid.Column="2">
    <Hyperlink Click="SelectHyperlink_Click">Search</Hyperlink>
    </TextBlock>
</Grid>

Мы вернемся к обработчику события “SelectHyperlink_Click” позже. Пока ничего нового… Сейчас нам нужно описать страницу поиска как PageFunction в соответствие с нашими требованиями. Вот пример того, как мы могли бы реализовать нашу страницу поиска:

    <PageFunction
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="MSLWPFPrototype.SearchPageFunction"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    x:TypeArguments="sys:String"
    Title="OrganizationSearchPageFunction">
        <Grid DockPanel.Dock="Top" Name="grid2" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.1*" SharedSizeGroup="Number"/>
                <ColumnDefinition Width="0.1*" SharedSizeGroup="Name"/>
                <ColumnDefinition Width="0.1*" SharedSizeGroup="StartDate"/>
                <ColumnDefinition Width="0.13*" SharedSizeGroup="EndDate"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="0.2*" />
                <RowDefinition Height="0.2*" />
                <RowDefinition Height="0.2*" />
                <RowDefinition Height="0.2*" />
                <RowDefinition Height="0.2*" />
                <RowDefinition Height="0.2*" />
          </Grid.RowDefinitions>
         <TextBlock Grid.Column="0" Grid.Row="0">
             <Hyperlink Click="okButton_Click" Tag=”Value1”>Value1</Hyperlink>
         </TextBlock>
         <TextBlock Grid.Column="1" Grid.Row="0">Value2</TextBlock>
         <TextBlock Grid.Column="2" Grid.Row="0">Value3</TextBlock>
         <TextBlock Grid.Column="3" Grid.Row="0">Value3</TextBlock>
    </Grid>
</PageFunction>

Самые интересные вещи в этом коде:

xmlns:sys="clr-namespace:System;assembly=mscorlib"
x:TypeArguments="sys:String"

Первая строка нужна для указания того, что мы хотим использовать тип .Net в данном случае string иTypeArguments это тип объекта, который PageFunction возвращает обратно на страницу, из которой был сделан вызов.

Нам также нужно реализовать эти два обработчика события как часть нашей PageFunction:

void okButton_Click(object sender, RoutedEventArgs e)
{
    // Принять результат если нажата кнопка OK
    Hyperlink cmd = (Hyperlink)sender;
    OnReturn(new ReturnEventArgs<string>((string)cmd.Tag));
}
void cancelButton_Click(object sender, RoutedEventArgs e)
{
    // Отмена поиска
    OnReturn(null);
}

Это все, что нужно для PageFunction, совершенно ничего сложного!!! Теперь нам нужно добавить еще пару обработчиков событий на основную страницу, которые позволят получать результат вызова PageFunction и отображать его в текстовом поле:

void taskPageFunction_Return(object sender, ReturnEventArgs<string> e)
{
    if (e == null) return;
    // Если поиск выполнен успешно, показать данные
    this.txtResult.Text = e.Result;
}

И обработчик события навигации для ссылки, позволяющий перейти на страницу поиска:

void SelectHyperlink_Click(object sender, RoutedEventArgs e)
{
    // Создание экземпляра страницы поиска
    SearchPageFunction taskPageFunction = new SearchPageFunction("Initial Data Item Value");
    taskPageFunction.Return += taskPageFunction_Return;
    this.NavigationService.Navigate(taskPageFunction);
}

Вот и все, наша PageFunction готова!!!!

Источник

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *