Pull to refresh

AdvancedApplicationBar. Улучшаем возможности ApplicationBar в WP7

Reading time 3 min
Views 2.6K
У многих разработчиков WP7 вызывает неприятное удивление реализация ApplicationBar. В шутку ходят грязные слухи, что эта компонента разрабатывалась вообще не в МС, а командой не имеющего к silverilght никакого отношения, которые написали компоненту по затребованному интерфейсу

Так как в нескольких проектах мне приходилось активно работать с ApplicationBar, я написал обертку AdvancedApplicationBar, которая позволяет значительно сократить объемы кода. По сути наиболее часто встречающиеся проблемы можно решить одними лишь разметками в XAML.

Итак, основные претензии к ApplicationBar которые часто можно услышать:

Для тех, кто вкусил вкусности MVVM неприятным открытием было отсутствие поддержки привязки данных (DataBinding), и соответственно, отсутствие поддержки ICommand. Гораздо приятнее, к примеру, IsEnabled свойство устанавливать из ViewModel-и, нежели писать фоновый код.

Отсутствие свойства Visibility — иногда приходится скрывать некоторые элементы в зависимости от определенных условий.

с ApplicationBar неудобно работать вместе с Panorama и/или Pivot. Довольно часто необходимо отображать разные элементы на каждой вкладке. Частично выручают ApplicationBar в ресурсах, которые подменяются на событии SelectionChanged, но при этом значительно усложняется код для поддержки свойств IsEnabled и т.д.

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

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

Также, несмотря на то что ApplicationBar реализует интерфейс IApplicationBar, которое является свойством Page, нельзя подменить на альтернативную реализацию, так как принимается только реализация ApplicationBar.

при разработке AdvancedApplicationBar я старался предоставлять решение типовых проблем одними разметками в XAML, без необходимости писать фоновый код.

Как подключить
Для использования надо добавить ссылку на sh.dll и добавить на страницу пространство xmlns:Sh=«clr-namespace:Sh;assembly=Sh»

Так как AdvancedApplicationBar работает как обертка над основным ApplicationBar, его надо разместить внутри основной панели (обычно Grid)
<phone:PhoneApplicationPage
      ...>
    <Grid x:Name="LayoutRoot" Background="Transparent">
        ...
        <Sh:AdvancedApplicationBar>
              ...
        </Sh:AdvancedApplicationBar>
    </Grid>
</phone:PhoneApplicationPage>

Основные возможности:
Поддержка привязки данных DataBinding, поддержка ICommand

<Sh:AdvancedApplicationBarIconButton
Text="{Binding AppBarIconButtonText}"
IconUri="{Binding AppBarIconButtonText}"
Visibility="{Binding Visibility}"
Command="{Binding DeleteCommand}"
CommandParameter=«42»
/>

Поддержка Panorama / Pivot:
Так как практически в каждом приложении необходимо было реализовывать возможность указания разных кнопок в ApplicationBar для каждой вкладки Panorama и иногда Pivot, я решил отказаться от необходимости добавления AppButton-ов и MenuItem-ов только внутри ApplicationBar.

К примеру, если нам надо надо что бы на странице всегда были кнопки добавления на первом месте и кнопку настроек в конце и между ними у нас должны быть элементы специфичные для конкретных вкладок панорамы, мы можем кнопку добавления расположить ДО панорамы, в каждом PanoramaItem-е можем разместить нужные нам AdvancedApplicationBarIconButton и AdvancedApplicationBarMenuItem:
и в конце можем разместить кнопку настроек.

Схематично:
 <!--ContentPanel - place additional content here-->        
 <Grid x:Name="ContentPanel" Margin="12,0,12,0">
      <Sh:AdvancedApplicationBarIconButton ... />
      <controls:Panorama>
          <controls:PanoramaItem>
              <Grid>
                  ...
                  <Sh:AdvancedApplicationBarIconButton .../>
                  <Sh:AdvancedApplicationBarIconButton ... />
                  <Sh:AdvancedApplicationBarMenuItem ... />
              </Grid>
          </controls:PanoramaItem>
          <controls:PanoramaItem>
              <Grid>
                  <Sh:AdvancedApplicationBarIconButton ... />
              </Grid>
          </controls:PanoramaItem>
      </controls:Panorama>
      <Sh:AdvancedApplicationBar>
          <Sh:AdvancedApplicationBarIconButton ... />
      </Sh:AdvancedApplicationBar>
 </Grid> 


Небольшая иллюстрация возможности работы с AdvancedApplicationBar без дополнительного кода, одними средствами XAML (и взаимодействие с AppBar через DataBinding):


Скачать библиотеку и исходный код с демонстрацией можно здесь

via akhmed.ru
Tags:
Hubs:
+26
Comments 9
Comments Comments 9

Articles