Программирование для Windows Phone для начинающих

Пивот и панорама. Разработка простейших приложений для Windows Phone 7

Разбить на страницы
Показывать лекцию целиком

Цель лекции: научиться создавать пивот и панораму, а также понять их структуру и предназначение.

Приложения на Silverlight, которые должны представлять пользователю большие объемы информации, традиционно используют структуру постраничной навигации. Однако для приложения, выполняющегося на телефоне, разделение на страницы не самое лучшее решение. Портретная ориентация, простота мультисенсорного ввода и приобретающие все большую популярность пользовательские интерфейсы "fluid"( "Fluid" в переводе с английского означает "подвижный", "изменчивый". Интерфейсы такого типа предполагают плавное перетекание одного экрана или страницы в другую .) – все эти факторы предлагают другие типы компоновки. Такие альтернативы представлены в Windows Phone 7 двумя новыми элементами управления: Pivot (Сводное представление) и Panorama (Панорама).

Панорама(Panorama) и пивот(Pivot) – два очень важных компонента в платформе Windows Phone 7. С их помощью можно создавать интерфейсы, которые будут вдохновлять и удивлять пользователя снова и снова. С первого взгляда вам может показаться, что они практически одинаковы и оба служат какой-то одной цели. Это не так.

Обычные приложения имеют определенные рамки размера экрана. Мы можем построить приложение, которое будет выходить за эти рамки! Панорама или пивот предоставляют нам уникальную возможность: построить наше приложение на экране увеличенного размера. Вот, пожалуй и все сходства между ними. Понимание разницы между ними поможет вам строить правильные приложения.

И Pivot, и Panorama располагаются в библиотеке Microsoft.Phone.Controls, поэтому любое приложение, использующее эти элементы управления, должно ссылаться на эту DLL. Описаны Pivot и Panorama в пространстве имен Microsoft.Phone.Controls, вспомогательные компоненты – в пространстве имен Microsoft.Phone.Controls.Primitives, но эти классы пригодятся лишь для настройки данных элементов управления.

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

(рис 9.1) Панорама

Панорама пробуждает интерес. Она представляет нам контент который привлекает внимание пользователя. Типичный случай использования – когда вам необходимо собрать информацию из различных источников в одном месте. Словно обложка журнала, панорама позволяет пользователю просматривать интересующий его контент и играет роль отправной точки для начала работы с этим контентом. Вам не следует управлять приложением из панорамы, сделайте ее отправной точкой для дальнейшей навигации по приложению. Представьте себе приложение "Поваренная Книга". На панораме можно собрать такие элементы как "Рецепт дня", "Что готовят мои друзья", "Магазины с товарами не далеко от меня" или другой важный контент. Пошаговый рецепт, заметки и связь с друзьями должны быть доступны с панорамы, но эти задачи не следует размещать там. Для этого применяют пивоты.

(рис 9.2) Пивот

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

В нашей "Поваренной Книге" мы используем Пивот для навигации к таким разделам как Рецепты, Избранное, что готовят друзья.

И Pivot, и Panorama наследуются от ItemsControl в виде класса с обобщенным параметром:

public class TemplatedItemsControl<T> : ItemsControl where T : new(), FrameworkElement

Здесь описывается ItemsControl, который предполагается заполнять объектами типа T. Pivot и Panorama наследуются от TemplatedItemsControl с заданием в качестве параметра типа PivotItem (Элемент сводного представления) или PanoramaItem (Элементы панорамы), соответственно:

public class Pivot : TemplatedItemsControl<PivotItem> 
public class Panorama : TemplatedItemsControl<PanoramaItem>

Предполагается, что элемент управления Pivot будет содержать элементы типа PivotItem, тогда как элемент управления Panorama будет включать элементы типа PanoramaItem. И PivotItem, и PanoramaItem наследуются от ContentControl. Если коллекция Items объекта Pivot или Panorama заполняется явно в XAML и коде, вы захотите заполнить ее элементами PivotItem или PanoramaItem; у этих элементов управления есть такое важное свойство, как Header (Верхний колонтитул), которое необходимо задать. Если же применяется привязка к свойству ItemsSource, определенному ItemsControl, эти объекты PivotItem и PanoramaItem создаются автоматически, а свойство Header задается через шаблон.

Для создания экземпляров этих элементов управления в XAML-файле необходимо объявить пространство имен XML для библиотеки и пространства имен Microsoft.Phone.Controls:

xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"

Само описание использования панорамы не подразумевает использование пивота внутри панорамы. Но многие разработчики всё же пытаются разместить пивот в панораме или наоборот. Это очень грустно, получается совсем не так классно, как в мозгах у дизайнеров и разработчиков. А пользователи просто хватаются за голову в ужасе.

Давайте разработаем наше первое серьёзное приложения, позволяющее выбирать пользователю между пивотом и панорамой. Также оно будет выводить заданный нами контент.

Для начала создадим новое Silverlight приложение PanoramaPivotControls. И на нашей главной странице добавим две кнопки, предоставляющие нам выбор:

Проект Silverlight: PanoramaPivotControls Файл: MainPage.xaml(фрагмент)

<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">

<TextBlock x:Name="ApplicationTitle" Text="PANORAMA AND PIVOT CONTROLS" Style="{StaticResource PhoneTextNormalStyle}"/>

<TextBlock x:Name="PageTitle" Text="Выбирайте" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>

 </StackPanel>

     <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">

            <Button Content="Попробуйте панораму" Height="168" HorizontalAlignment="Left" 
Margin="35,82,0,0" Name="btnPanorama" VerticalAlignment="Top" Width="383" 
Click="btnPanorama_Click" />

<Button Content="Познакомьтесь с пивотом" Height="168" HorizontalAlignment="Left" 
Margin="35,297,0,0" Name="btnPivot" VerticalAlignment="Top" 
Width="383" Click="btnPivot_Click" />
            
     </Grid>

На форме слева отобразились кнопки, созданные нами, теперь создадим две необходимые нам страницы. Нажимаем Project, затем Add New Item и из списка выбираем Windows Phone Panorama Page, затем проделываем эту операцию для Windows Phone Pivot Page.

В списке файлов проекта у нас появились четыре файла:

XAML – файл PanoramaPage1.xaml и его обработчик PanoramaPage1.xaml.cs, а также

XAML – файл PivotPage1.xaml и его обработчик PivotPage1.xaml.cs. Для нашего проекта нам понадобится ещё один файл – это фон для панорамы. Вы можете использовать любое изображение, подходящего формата. Желательно, чтобы оно было пропорционально вашей панораме. Я применю следующий фон, размером 800 на 600 пикселей:

(рис 9.3) Фон панорамы

Чтобы загрузить его в проект нажмите правой кнопкой мыши на название проекта в меню Solution Explorer, затем Add и Existing Item. Укажите на ваш фон, затем нажмите кнопку Add. Я назвал фон samplePhoto.jpg. В итоге наш проект состоит из следующих файлов:

(рис 9.4) Solution Explorer

Пришло время запрограммировать кнопки, для этого нажимаем на них дважды и добавляем каждой событие перехода на нужную страницу:

Проект Silverlight: PanoramaPivotControls Файл: MainPage.xaml.cs(фрагмент)

public partial class MainPage : PhoneApplicationPage
    {
           public MainPage()
        {
            InitializeComponent();
        }
     
        private void btnPanorama_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri("/PanoramaPage1.xaml", UriKind.Relative));
        }

        private void btnPivot_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri("/PivotPage1.xaml", UriKind.Relative));
        }
    }

Теперь, когда кнопки выполняют свою функцию, добавим информации, вот код для пивота:

Проект Silverlight: PanoramaPivotControls Файл: PivotPage1.xaml

<phone:PhoneApplicationPage 
    x:Class="PanoramaPivotControls.PivotPage1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait"  Orientation="Portrait"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <!--Pivot Control-->
        <controls:Pivot Title="PIVOT CONTROL">
            <!--Pivot item one-->
            <controls:PivotItem Header="item1">
                <Grid>
                    <!--Added textbox control with formatted text-->
                    <TextBlock
       TextWrapping="Wrap"
       Style="{StaticResource PhoneTextLargeStyle}">
       <Run>Здесь вы можете добавить любой текст в ваш пивот, в любом количестве.</Run>
       <LineBreak/>
       <LineBreak/>
       <Run>С переносами строк и красивыми рисунками...</Run>
                    </TextBlock>
                </Grid>

            </controls:PivotItem>

            <!--Pivot item two-->
            <controls:PivotItem Header="item2">
                <!--Added background image and text content-->
                <Border
        BorderBrush="{StaticResource PhoneForegroundBrush}"
        BorderThickness="{StaticResource PhoneBorderThickness}">
                    <Grid>
                        <Image
                    Source="samplePhoto.jpg"
                    Stretch="UniformToFill"/>
                        <TextBlock
                    Text="Также вы можете размещать текст на выбранном вами фоне."
                    TextWrapping="Wrap"
                    Style="{StaticResource PhoneTextExtraLargeStyle}" />
                    </Grid>
                </Border>

            </controls:PivotItem>

            <!--Pivot item three-->
            <controls:PivotItem Header="item3">
                <!--This code is a series of string text values-->
                <Grid>
                    <ListBox FontSize="{StaticResource PhoneFontSizeLarge}">
                        <sys:String>Эта</sys:String>
                        <sys:String>часть</sys:String>
                        <sys:String>пивота</sys:String>
                        <sys:String>содержит</sys:String>
                        <sys:String>некоторое</sys:String>
                        <sys:String>количество</sys:String>
                        <sys:String>строк</sys:String>
                        <sys:String>которые</sys:String>
                        <sys:String>вы</sys:String>
                        <sys:String>можете</sys:String>
                        <sys:String>прокручивать</sys:String>
                        <sys:String>вверх</sys:String>
                        <sys:String>и</sys:String>
                        <sys:String>вниз</sys:String>
                        <sys:String>снова</sys:String>
                        <sys:String>и</sys:String>
                        <sys:String>снова</sys:String>
                        <sys:String>!!!!</sys:String>
                    </ListBox>
                </Grid>

            </controls:PivotItem>


        </controls:Pivot>
    </Grid>
</phone:PhoneApplicationPage>

Обратите внимание, что пивот состоит из частей, эти части, по сути своей – отдельные экраны. Внутри каждой из частей располагается любой контент, который вы в нём разместите. Для открытия и закрытия части пивота используются теги:

<controls:PivotItem Header="item1">
…
 </controls:PivotItem>

Теперь перейдём к панораме и файлу PanoramaPage1.xaml:

Проект Silverlight: PanoramaPivotControls Файл: PanoramaPage1.xaml

<phone:PhoneApplicationPage 
    x:Class="PanoramaPivotControls.PanoramaPage1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait"  Orientation="Portrait"
    shell:SystemTray.IsVisible="False">

    <!--LayoutRoot contains the root grid where all other page content is placed-->
    <Grid x:Name="LayoutRoot">
        <controls:Panorama Title="my pano">

            <!--Assigns a background image to the Panorama control-->
            <controls:Panorama.Background>
                <ImageBrush ImageSource="samplePhoto.jpg"/>
            </controls:Panorama.Background>


            <!--Panorama item one-->
            <controls:PanoramaItem Header="item1">
                <Grid>
                    <!--This code creates two TextBlock controls and places them in a StackPanel control-->
                    <StackPanel>
                        <TextBlock
                    Text="Здесь вы можете добавить любой текст в вашу панораму, в любом количестве."
                    Style="{StaticResource PhoneTextLargeStyle}"
                    TextWrapping="Wrap"/>
                        <TextBlock Text=" "/>
                        <TextBlock
                    Text="Здесь может быть любой контент..."
                    Style="{StaticResource PhoneTextLargeStyle}"
                    TextWrapping="Wrap"/>
                    </StackPanel>
                </Grid>

            </controls:PanoramaItem>

            <!--Panorama item two-->
            <controls:PanoramaItem Header="item2" Orientation="Horizontal">
                <!-- Assigns a border to the PanoramaItem control and background for the content section. -->
                <Grid>
                    <Border
                BorderBrush="{StaticResource PhoneForegroundBrush}"
                BorderThickness="{StaticResource PhoneBorderThickness}"
                Background="#80808080">
                        <TextBlock
                    Text="Здесь располагается достаточно широкое содержимое вашей панорамы."
                    Style="{StaticResource PhoneTextExtraLargeStyle}"
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center" >
                        </TextBlock>

                    </Border>
                </Grid>
            </controls:PanoramaItem>

            <!--Panorama item three-->
            <controls:PanoramaItem Header="item3">
                <Grid>
                    <ListBox FontSize="{StaticResource PhoneFontSizeLarge}">
                        <sys:String>Эта</sys:String>
                        <sys:String>часть</sys:String>
                        <sys:String>панорамы</sys:String>
                        <sys:String>содержит</sys:String>
                        <sys:String>некоторое</sys:String>
                        <sys:String>количество</sys:String>
                        <sys:String>строк</sys:String>
                        <sys:String>которые</sys:String>
                        <sys:String>вы</sys:String>
                        <sys:String>можете</sys:String>
                        <sys:String>прокручивать</sys:String>
                        <sys:String>вверх</sys:String>
                        <sys:String>и</sys:String>
                        <sys:String>вниз</sys:String>
                        <sys:String>снова</sys:String>
                        <sys:String>и</sys:String>
                        <sys:String>снова</sys:String>
                        <sys:String>!!!!</sys:String>
                    </ListBox>
               
                </Grid>
            </controls:PanoramaItem>
        </controls:Panorama>
    </Grid>
</phone:PhoneApplicationPage>

Как вы заметили, фон нашей панорамы задаётся следующим образом:

            <controls:Panorama.Background>
                <ImageBrush ImageSource="samplePhoto.jpg"/>
            </controls:Panorama.Background>

Теперь запустим наше приложение и тщательно обследуем. Я нахожу эти элементы достаточно красочными, осталось дело за контентом, дерзайте.

(рис 9.5) Результат. Панорама (рис 9.6) Результат. Пивот

Ключевые термины

Panorama– элемент управления приложения Silverlight на платформе Windows Phone 7, представляющий собой прокручиваемое окно, содержащее информацию, разбитую на группы.

Pivot– элемент управления приложения Silverlight на платформе Windows Phone 7, для создания своеобразных табов. Как правило состоит из нескольких частей.

Краткие итоги

В данной лекции мы:

  • изучили элемент Pivot и особенности его использования;
  • познакомились с элементом управления Panorama, разобрались его назначением и особенностями;
  • написали программу, содержащую эти два элемента и наглядно демонстрирующую их преимущества.
  • Набор для практики

    Упражнения

    Создайте панораму, содержащую ссылки на обычные страницы Silverlight приложения.

    Страницы:

    Цель лекции: научиться создавать пивот и панораму, а также понять их структуру и предназначение.

    Приложения на Silverlight, которые должны представлять пользователю большие объемы информации, традиционно используют структуру постраничной навигации. Однако для приложения, выполняющегося на телефоне, разделение на страницы не самое лучшее решение. Портретная ориентация, простота мультисенсорного ввода и приобретающие все большую популярность пользовательские интерфейсы "fluid"( "Fluid" в переводе с английского означает "подвижный", "изменчивый". Интерфейсы такого типа предполагают плавное перетекание одного экрана или страницы в другую .) – все эти факторы предлагают другие типы компоновки. Такие альтернативы представлены в Windows Phone 7 двумя новыми элементами управления: Pivot (Сводное представление) и Panorama (Панорама).

    Панорама(Panorama) и пивот(Pivot) – два очень важных компонента в платформе Windows Phone 7. С их помощью можно создавать интерфейсы, которые будут вдохновлять и удивлять пользователя снова и снова. С первого взгляда вам может показаться, что они практически одинаковы и оба служат какой-то одной цели. Это не так.

    Обычные приложения имеют определенные рамки размера экрана. Мы можем построить приложение, которое будет выходить за эти рамки! Панорама или пивот предоставляют нам уникальную возможность: построить наше приложение на экране увеличенного размера. Вот, пожалуй и все сходства между ними. Понимание разницы между ними поможет вам строить правильные приложения.

    И Pivot, и Panorama располагаются в библиотеке Microsoft.Phone.Controls, поэтому любое приложение, использующее эти элементы управления, должно ссылаться на эту DLL. Описаны Pivot и Panorama в пространстве имен Microsoft.Phone.Controls, вспомогательные компоненты – в пространстве имен Microsoft.Phone.Controls.Primitives, но эти классы пригодятся лишь для настройки данных элементов управления.

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

    (рис 9.1) Панорама

    Панорама пробуждает интерес. Она представляет нам контент который привлекает внимание пользователя. Типичный случай использования – когда вам необходимо собрать информацию из различных источников в одном месте. Словно обложка журнала, панорама позволяет пользователю просматривать интересующий его контент и играет роль отправной точки для начала работы с этим контентом. Вам не следует управлять приложением из панорамы, сделайте ее отправной точкой для дальнейшей навигации по приложению. Представьте себе приложение "Поваренная Книга". На панораме можно собрать такие элементы как "Рецепт дня", "Что готовят мои друзья", "Магазины с товарами не далеко от меня" или другой важный контент. Пошаговый рецепт, заметки и связь с друзьями должны быть доступны с панорамы, но эти задачи не следует размещать там. Для этого применяют пивоты.

    (рис 9.2) Пивот

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

    В нашей "Поваренной Книге" мы используем Пивот для навигации к таким разделам как Рецепты, Избранное, что готовят друзья.

    И Pivot, и Panorama наследуются от ItemsControl в виде класса с обобщенным параметром:

    public class TemplatedItemsControl<T> : ItemsControl where T : new(), FrameworkElement

    Здесь описывается ItemsControl, который предполагается заполнять объектами типа T. Pivot и Panorama наследуются от TemplatedItemsControl с заданием в качестве параметра типа PivotItem (Элемент сводного представления) или PanoramaItem (Элементы панорамы), соответственно:

    public class Pivot : TemplatedItemsControl<PivotItem> 
    public class Panorama : TemplatedItemsControl<PanoramaItem>
    

    Предполагается, что элемент управления Pivot будет содержать элементы типа PivotItem, тогда как элемент управления Panorama будет включать элементы типа PanoramaItem. И PivotItem, и PanoramaItem наследуются от ContentControl. Если коллекция Items объекта Pivot или Panorama заполняется явно в XAML и коде, вы захотите заполнить ее элементами PivotItem или PanoramaItem; у этих элементов управления есть такое важное свойство, как Header (Верхний колонтитул), которое необходимо задать. Если же применяется привязка к свойству ItemsSource, определенному ItemsControl, эти объекты PivotItem и PanoramaItem создаются автоматически, а свойство Header задается через шаблон.

    Для создания экземпляров этих элементов управления в XAML-файле необходимо объявить пространство имен XML для библиотеки и пространства имен Microsoft.Phone.Controls:

    xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
    

    Само описание использования панорамы не подразумевает использование пивота внутри панорамы. Но многие разработчики всё же пытаются разместить пивот в панораме или наоборот. Это очень грустно, получается совсем не так классно, как в мозгах у дизайнеров и разработчиков. А пользователи просто хватаются за голову в ужасе.

    Давайте разработаем наше первое серьёзное приложения, позволяющее выбирать пользователю между пивотом и панорамой. Также оно будет выводить заданный нами контент.

    Для начала создадим новое Silverlight приложение PanoramaPivotControls. И на нашей главной странице добавим две кнопки, предоставляющие нам выбор:

    Проект Silverlight: PanoramaPivotControls Файл: MainPage.xaml(фрагмент)

    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
    
    <TextBlock x:Name="ApplicationTitle" Text="PANORAMA AND PIVOT CONTROLS" Style="{StaticResource PhoneTextNormalStyle}"/>
    
    <TextBlock x:Name="PageTitle" Text="Выбирайте" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    
     </StackPanel>
    
         <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    
                <Button Content="Попробуйте панораму" Height="168" HorizontalAlignment="Left" 
    Margin="35,82,0,0" Name="btnPanorama" VerticalAlignment="Top" Width="383" 
    Click="btnPanorama_Click" />
    
    <Button Content="Познакомьтесь с пивотом" Height="168" HorizontalAlignment="Left" 
    Margin="35,297,0,0" Name="btnPivot" VerticalAlignment="Top" 
    Width="383" Click="btnPivot_Click" />
                
         </Grid>

    На форме слева отобразились кнопки, созданные нами, теперь создадим две необходимые нам страницы. Нажимаем Project, затем Add New Item и из списка выбираем Windows Phone Panorama Page, затем проделываем эту операцию для Windows Phone Pivot Page.

    В списке файлов проекта у нас появились четыре файла:

    XAML – файл PanoramaPage1.xaml и его обработчик PanoramaPage1.xaml.cs, а также

    XAML – файл PivotPage1.xaml и его обработчик PivotPage1.xaml.cs. Для нашего проекта нам понадобится ещё один файл – это фон для панорамы. Вы можете использовать любое изображение, подходящего формата. Желательно, чтобы оно было пропорционально вашей панораме. Я применю следующий фон, размером 800 на 600 пикселей:

    (рис 9.3) Фон панорамы

    Чтобы загрузить его в проект нажмите правой кнопкой мыши на название проекта в меню Solution Explorer, затем Add и Existing Item. Укажите на ваш фон, затем нажмите кнопку Add. Я назвал фон samplePhoto.jpg. В итоге наш проект состоит из следующих файлов:

    (рис 9.4) Solution Explorer

    Пришло время запрограммировать кнопки, для этого нажимаем на них дважды и добавляем каждой событие перехода на нужную страницу:

    Проект Silverlight: PanoramaPivotControls Файл: MainPage.xaml.cs(фрагмент)

    public partial class MainPage : PhoneApplicationPage
        {
               public MainPage()
            {
                InitializeComponent();
            }
         
            private void btnPanorama_Click(object sender, RoutedEventArgs e)
            {
                NavigationService.Navigate(new Uri("/PanoramaPage1.xaml", UriKind.Relative));
            }
    
            private void btnPivot_Click(object sender, RoutedEventArgs e)
            {
                NavigationService.Navigate(new Uri("/PivotPage1.xaml", UriKind.Relative));
            }
        }
    

    Теперь, когда кнопки выполняют свою функцию, добавим информации, вот код для пивота:

    Проект Silverlight: PanoramaPivotControls Файл: PivotPage1.xaml

    <phone:PhoneApplicationPage 
        x:Class="PanoramaPivotControls.PivotPage1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait"  Orientation="Portrait"
        shell:SystemTray.IsVisible="True">
    
        <!--LayoutRoot is the root grid where all page content is placed-->
        <Grid x:Name="LayoutRoot" Background="Transparent">
            <!--Pivot Control-->
            <controls:Pivot Title="PIVOT CONTROL">
                <!--Pivot item one-->
                <controls:PivotItem Header="item1">
                    <Grid>
                        <!--Added textbox control with formatted text-->
                        <TextBlock
           TextWrapping="Wrap"
           Style="{StaticResource PhoneTextLargeStyle}">
           <Run>Здесь вы можете добавить любой текст в ваш пивот, в любом количестве.</Run>
           <LineBreak/>
           <LineBreak/>
           <Run>С переносами строк и красивыми рисунками...</Run>
                        </TextBlock>
                    </Grid>
    
                </controls:PivotItem>
    
                <!--Pivot item two-->
                <controls:PivotItem Header="item2">
                    <!--Added background image and text content-->
                    <Border
            BorderBrush="{StaticResource PhoneForegroundBrush}"
            BorderThickness="{StaticResource PhoneBorderThickness}">
                        <Grid>
                            <Image
                        Source="samplePhoto.jpg"
                        Stretch="UniformToFill"/>
                            <TextBlock
                        Text="Также вы можете размещать текст на выбранном вами фоне."
                        TextWrapping="Wrap"
                        Style="{StaticResource PhoneTextExtraLargeStyle}" />
                        </Grid>
                    </Border>
    
                </controls:PivotItem>
    
                <!--Pivot item three-->
                <controls:PivotItem Header="item3">
                    <!--This code is a series of string text values-->
                    <Grid>
                        <ListBox FontSize="{StaticResource PhoneFontSizeLarge}">
                            <sys:String>Эта</sys:String>
                            <sys:String>часть</sys:String>
                            <sys:String>пивота</sys:String>
                            <sys:String>содержит</sys:String>
                            <sys:String>некоторое</sys:String>
                            <sys:String>количество</sys:String>
                            <sys:String>строк</sys:String>
                            <sys:String>которые</sys:String>
                            <sys:String>вы</sys:String>
                            <sys:String>можете</sys:String>
                            <sys:String>прокручивать</sys:String>
                            <sys:String>вверх</sys:String>
                            <sys:String>и</sys:String>
                            <sys:String>вниз</sys:String>
                            <sys:String>снова</sys:String>
                            <sys:String>и</sys:String>
                            <sys:String>снова</sys:String>
                            <sys:String>!!!!</sys:String>
                        </ListBox>
                    </Grid>
    
                </controls:PivotItem>
    
    
            </controls:Pivot>
        </Grid>
    </phone:PhoneApplicationPage>

    Обратите внимание, что пивот состоит из частей, эти части, по сути своей – отдельные экраны. Внутри каждой из частей располагается любой контент, который вы в нём разместите. Для открытия и закрытия части пивота используются теги:

    <controls:PivotItem Header="item1">
    …
     </controls:PivotItem>
    

    Теперь перейдём к панораме и файлу PanoramaPage1.xaml:

    Проект Silverlight: PanoramaPivotControls Файл: PanoramaPage1.xaml

    <phone:PhoneApplicationPage 
        x:Class="PanoramaPivotControls.PanoramaPage1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait"  Orientation="Portrait"
        shell:SystemTray.IsVisible="False">
    
        <!--LayoutRoot contains the root grid where all other page content is placed-->
        <Grid x:Name="LayoutRoot">
            <controls:Panorama Title="my pano">
    
                <!--Assigns a background image to the Panorama control-->
                <controls:Panorama.Background>
                    <ImageBrush ImageSource="samplePhoto.jpg"/>
                </controls:Panorama.Background>
    
    
                <!--Panorama item one-->
                <controls:PanoramaItem Header="item1">
                    <Grid>
                        <!--This code creates two TextBlock controls and places them in a StackPanel control-->
                        <StackPanel>
                            <TextBlock
                        Text="Здесь вы можете добавить любой текст в вашу панораму, в любом количестве."
                        Style="{StaticResource PhoneTextLargeStyle}"
                        TextWrapping="Wrap"/>
                            <TextBlock Text=" "/>
                            <TextBlock
                        Text="Здесь может быть любой контент..."
                        Style="{StaticResource PhoneTextLargeStyle}"
                        TextWrapping="Wrap"/>
                        </StackPanel>
                    </Grid>
    
                </controls:PanoramaItem>
    
                <!--Panorama item two-->
                <controls:PanoramaItem Header="item2" Orientation="Horizontal">
                    <!-- Assigns a border to the PanoramaItem control and background for the content section. -->
                    <Grid>
                        <Border
                    BorderBrush="{StaticResource PhoneForegroundBrush}"
                    BorderThickness="{StaticResource PhoneBorderThickness}"
                    Background="#80808080">
                            <TextBlock
                        Text="Здесь располагается достаточно широкое содержимое вашей панорамы."
                        Style="{StaticResource PhoneTextExtraLargeStyle}"
                        HorizontalAlignment="Center"
                        VerticalAlignment="Center" >
                            </TextBlock>
    
                        </Border>
                    </Grid>
                </controls:PanoramaItem>
    
                <!--Panorama item three-->
                <controls:PanoramaItem Header="item3">
                    <Grid>
                        <ListBox FontSize="{StaticResource PhoneFontSizeLarge}">
                            <sys:String>Эта</sys:String>
                            <sys:String>часть</sys:String>
                            <sys:String>панорамы</sys:String>
                            <sys:String>содержит</sys:String>
                            <sys:String>некоторое</sys:String>
                            <sys:String>количество</sys:String>
                            <sys:String>строк</sys:String>
                            <sys:String>которые</sys:String>
                            <sys:String>вы</sys:String>
                            <sys:String>можете</sys:String>
                            <sys:String>прокручивать</sys:String>
                            <sys:String>вверх</sys:String>
                            <sys:String>и</sys:String>
                            <sys:String>вниз</sys:String>
                            <sys:String>снова</sys:String>
                            <sys:String>и</sys:String>
                            <sys:String>снова</sys:String>
                            <sys:String>!!!!</sys:String>
                        </ListBox>
                   
                    </Grid>
                </controls:PanoramaItem>
            </controls:Panorama>
        </Grid>
    </phone:PhoneApplicationPage>

    Как вы заметили, фон нашей панорамы задаётся следующим образом:

                <controls:Panorama.Background>
                    <ImageBrush ImageSource="samplePhoto.jpg"/>
                </controls:Panorama.Background>
    
    

    Теперь запустим наше приложение и тщательно обследуем. Я нахожу эти элементы достаточно красочными, осталось дело за контентом, дерзайте.

    (рис 9.5) Результат. Панорама (рис 9.6) Результат. Пивот

    Ключевые термины

    Panorama– элемент управления приложения Silverlight на платформе Windows Phone 7, представляющий собой прокручиваемое окно, содержащее информацию, разбитую на группы.

    Pivot– элемент управления приложения Silverlight на платформе Windows Phone 7, для создания своеобразных табов. Как правило состоит из нескольких частей.

    Краткие итоги

    В данной лекции мы:

  • изучили элемент Pivot и особенности его использования;
  • познакомились с элементом управления Panorama, разобрались его назначением и особенностями;
  • написали программу, содержащую эти два элемента и наглядно демонстрирующую их преимущества.
  • Набор для практики

    Упражнения

    Создайте панораму, содержащую ссылки на обычные страницы Silverlight приложения.

    Вернуться к учебному плану