Локализация Applicationbar С Использованием Привязки

Когда я учился разрабатывать приложения на базе MVVM, мне очень не нравилось, что во многих статьях показано, как создается ApplicationBar во ViewModel. Там кнопки и пункты меню заполнены локализованными строками.

Я долго искал решение, и оно было найдено.

Внимание! В статье описано только решение проблемы локализации панели приложения и предполагается, что читатели знакомы с основами XAML, MVVM, привязкой данных и локализацией приложения.

Встречайте библиотеку для локализации панели приложения: http://appbarutils.codeplex.com/ Для проверки создадим страницу приложения и добавим на нее обычную панель приложения с кнопками и, при необходимости, пунктами меню.

Например, вот так:

  
  
  
  
   

<shell:ApplicationBar> <shell:ApplicationBar.MenuItems> <shell:ApplicationBarMenuItem IsEnabled="True" Text="lookscreen"/> </shell:ApplicationBar.MenuItems> <shell:ApplicationBarIconButton IconUri="/Assets/AppBar/save.png" IsEnabled="True" Text="save"/> </shell:ApplicationBar>

Обратите внимание: свойство Text не должно содержать пробелов.

Работоспособность при наличии кириллицы я не проверял.

Добавьте пакет AppBarUtils в приложение командой Установочный пакет AppBarUtils или через менеджер пакетов.

Добавьте в разметку страницы ссылку на сборку этого пакета:

xmlns:AppBarUtils="clr-namespace:AppBarUtils;assembly=AppBarUtils"

И еще нам нужна сборка для установки поведения:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

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

У меня получилось вот так:

<i:Interaction.Behaviors> <AppBarUtils:AppBarItemCommand Id="save" Type="Button" Command="{Binding SaveCommand}" Text="{Binding LocalizedResources.SaveButton, Mode=OneWay, Source={StaticResource LocalizedStrings}}"/> <AppBarUtils:AppBarItemCommand Id="lookscreen" Type="MenuItem" Command="{Binding LookScreenCommand}" Text="{Binding LocalizedResources.ScreenItem, Mode=OneWay, Source={StaticResource LocalizedStrings}}"/> </i:Interaction.Behaviors>

Поведение связывается с элементом, которому оно присвоено по идентификатору со значением, равным свойству Text пункта меню или кнопки.

Кроме того, указывается тип элемента меню, которому задается поведение: для кнопки — Button, для пункта меню — MenuItem. Смысл остальных свойств, думаю, объяснять не нужно.

После всех манипуляций у меня получилась страница в реальном приложении, которое опубликовано в магазине Windows Phone: XAML

< phone:PhoneApplicationPage 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:d="http://schemas.microsoft.com/expression/blend/2008 " xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006 " xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity " xmlns:Command="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WP8 " xmlns:AppBarUtils="clr-namespace:AppBarUtils;assembly=AppBarUtils " x:Class="CatDay.MainPage" mc:Ignorable="d " FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" SupportedOrientations ="PortraitOrLandscape" shell:SystemTray.IsVisible="True " DataContext="{Binding Main, Mode=OneWay, Source={StaticResource Locator}}"> < shell:SystemTray.ProgressIndicator > < shell:ProgressIndicator IsIndeterminate="true" IsVisible="{Binding ProgressBarValue}" Text="{Binding ProgressBarText}" /> </ shell:SystemTray.ProgressIndicator > < phone:PhoneApplicationPage.ApplicationBar > < shell:ApplicationBar > < shell:ApplicationBar.MenuItems > < shell:ApplicationBarMenuItem IsEnabled="True" Text="donate"/> < shell:ApplicationBarMenuItem IsEnabled="True" Text="lookscreen"/> < shell:ApplicationBarMenuItem IsEnabled="True" Text="skydrive"/> < shell:ApplicationBarMenuItem IsEnabled="True" Text="feedback"/> </ shell:ApplicationBar.MenuItems > < shell:ApplicationBarIconButton IconUri="/Assets/AppBar/transport.rew.png" IsEnabled="True" Text="previus"/> < shell:ApplicationBarIconButton IconUri="/Assets/AppBar/save.png" IsEnabled="True" Text="save"/> < shell:ApplicationBarIconButton IconUri="/Assets/AppBar/share.png" IsEnabled="True" Text="share"/> < shell:ApplicationBarIconButton IconUri="/Assets/AppBar/transport.ff.png" IsEnabled="True" Text="next"/> </ shell:ApplicationBar > </ phone:PhoneApplicationPage.ApplicationBar >

Теги: #XAML #windows phone #локализация интерфейса #Разработка для Windows Phone

Вместе с данным постом часто просматривают: