Статьи

Использование панели приложений в приложениях Windows Phone 7

Запуск событий приложений не представляет большой проблемы, если вы знакомы с основами Silverlight. Есть кнопки, переключатели, всевозможные пользовательские элементы управления и автоматические триггеры событий. Если вы когда-нибудь задумывались о реализации пользовательского списка действий для выбора пользователем (например, меню) в приложении Windows Phone 7, вам не нужно реализовывать пользовательский механизм. Конечно, никто не говорит, что ты не можешь, но ты должен?

Публичный SDK поставляется с ApplicationBar — модулем пользовательского интерфейса, который можно разместить на странице, которая позволит пользователям выбирать из набора параметров. Это аналогия для меню — элемент управления, который вы, вероятно, очень хорошо знаете по настольным системам и смартфонам, таким как Blackberry.

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

В sidenote ApplicationBar привязан к странице, а не к самому приложению. Поэтому вы должны создавать отдельные экземпляры ApplicationBar на разных страницах.

Если бы мне пришлось представлять ApplicationBar, показанный выше в XAML, это выглядело бы так:

<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
<shell:ApplicationBarIconButton IconUri="/Images/appbar_button1.png" Text="Button 1"/>
<shell:ApplicationBarIconButton IconUri="/Images/appbar_button2.png" Text="Button 2"/>
<shell:ApplicationBar.MenuItems>
<shell:ApplicationBarMenuItem Text="MenuItem 1"/>
<shell:ApplicationBarMenuItem Text="MenuItem 2"/>
</shell:ApplicationBar.MenuItems>
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>

Фактически, это пример разметки XAML, предоставляемой в каждом новом приложении Windows Phone 7 (по умолчанию она закомментирована). Но вы можете видеть четкое разделение — есть экземпляры ApplicationBarIconButton, которые представляют собой значки, которые отображаются всегда, и экземпляры ApplicationBarMenuItem, которые скрыты, если вы используете параметры по умолчанию.

ПРИМЕЧАНИЕ . Максимальное количество возможных экземпляров ApplicationBarIconButton ограничено 4. Максимальное количество пунктов меню ограничено 50, но только в виде идентификатора — ApplicationBar действительно не место для размещения более 4-5 пунктов меню.

Если вы использовали Windows Phone 7, вы, вероятно, заметили, что некоторые приложения имеют собственный цвет, определенный для фона панели приложений. Одним хорошим примером будет приложение Twitter. Это делается путем определения свойства BackgroundColor:

<shell:ApplicationBar IsVisible="True" BackgroundColor="Green" IsMenuEnabled="True">

Конечно, поскольку белый не сочетается со всеми возможными цветами фона, вы также можете настроить передний план:

<shell:ApplicationBar IsVisible="True" BackgroundColor="Green" ForegroundColor="Blue" IsMenuEnabled="True">

Как вы можете видеть, границы линий значков также меняют цвет. Но важно отметить, что в зависимости от значка круги могут быть не видны. Говоря об этом, я настоятельно рекомендую поискать здесь некоторые высококачественные значки для панели приложений, которые по умолчанию поставляются вместе с SDK:

C: \ Program Files (x86) \ Microsoft SDK \ Windows Phone \ v7.0 \ Icons

Но, конечно, это не требование.

Кнопки значков и элементы меню можно привязать к обычным обработчикам событий, как к любому элементу управления пользовательского интерфейса, в частности к обработчику событий Click:

<shell:ApplicationBarIconButton IconUri="ApplicationIcon.png" Text="Button 1" Click="ApplicationBarIconButton_Click"/>

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

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

myButtonName.IsEnabled = false;

И в тот момент, когда вы запускаете эту строку, вы получаете исключение NullReferenceException . Проблема в том, что на самом деле и кнопки значков, и пункты меню не идентифицируются по их имени, и это хорошо видно в Reflector. Если вы разберете ApplicationBarIconButton , вы должны увидеть это:

public class ApplicationBarIconButton : IApplicationBarIconButton, IApplicationBarMenuItem
{
// Fields
private EventHandler<BoolEventArgs> Changed;
private EventHandler Click;
private bool mEnabled;
private Uri mIconUri;
private string mText;

// Events
internal event EventHandler<BoolEventArgs> Changed;
public event EventHandler Click;

// Methods
public ApplicationBarIconButton();
public ApplicationBarIconButton(Uri iconUri);
internal void ClickEvent();
internal void UpdateOrRevert(object original, object field);

// Properties
public Uri IconUri { get; set; }
public bool IsEnabled { get; set; }
public string Text { get; set; }
}

Обычный элемент управления Button (использующий это в качестве примера), который следует этой последовательности деривации:

ButtonBase -> ContentControl -> Control -> FrameworkElement

Класс FrameworkElement предоставляет свойство зависимостей NameProperty, IApplicationBarIconButton и IApplicationBarMenuItem не предоставляют реализацию для этого, равно как и фундаментальный класс.

Здесь нужно сделать ссылки на меню и кнопки-объекты по их индексу:

((ApplicationBarIconButton)ApplicationBar.Buttons[0]).IsEnabled = false;

То же самое относится к пунктам меню:

((ApplicationBarMenuItem)ApplicationBar.MenuItems[0]).IsEnabled = false;

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