Ласкаво просимо до dev.net.ua Увійти | Приєднатися | Допомога

Helen

designer for developers

Новини

Полезные ссылки

Implicit Styles - cтилизируем ВСЁ

Одна из новых замечательных возможностей, которую уже можно попробовать в Silverlight 4 Beta, – это Implicit Styles. Позаимствованная из WPF, она позволяет задавать унифицированный стиль для всех элементов управления одного типа. Например, не прибегая к темам из Silverlight Toolkit, Вы можете один раз задать стиль для кнопок, текстовых полей, скроллинга, полностью стилизировав эти элементы в приложении раз и навсегда.

Что понадобится дизайнеру?

Дизайнеру для разработки понадобится установить:

Полный список инструментов смотреть тут.

С чего начать? С кнопки!

Создадим в Microsoft Expression Blend Preview for .NET 4 новый проект приложения на Silverlight 4. Возьмем небольшой набор графических элементов, который мы хотим преобразовать в стиль для кнопки. Состоит он из закругленного элемента Border и текстового блока.

<Border x:Name="Blue" HorizontalAlignment="Center" VerticalAlignment="Center" Background="#FF308899" CornerRadius="5" Padding="10,5">
            <TextBlock Foreground="White" HorizontalAlignment="Center" TextWrapping="Wrap" Text="Button" VerticalAlignment="Center"/>
</Border>

А выглядит следующим образом:

1

Выделяем элемент Border в панели Objects & Timeline, вызываем контекстное меню и выбираем пункт “Make into control”. В появившемся диалоговом окне набираем в поиске Button, щелкаем на элемент Button, и в поле Name выбираем пункт “Apply to all” – таким образом мы будем задавать один общий стиль для всех кнопок. Также Вы можете создать новый файл ресурсов, и разместить стиль именно там.

2

После проделанной процедуры, в панели ресурсов можно увидеть следующее:

3

Появился ресурс с названием [Button default] – кликнув на который мы зайдем в режим редактирования стиля кнопки. Выполняя команду преобразования графических элементов в работающий элемент управления, Blend сделал практически всю работу за нас. Осталось немного подправить мелочи.

Собственно, мелочи…

Выделим в панели Objects & Timeline пункт Style

4_0

И зайдем в режим редактирования шаблона

4

В панели Objects & Timeline перетащим элемент ContentPresenter внутрь элемента Border. Если этого не сделать, то в нашем случае, кнопка может выглядеть не очень красиво – без внутренних отступов.

5

После того как мы переместили ContentPresenter внутрь элемента Border – кнопка выглядит так:

1

Ресурсы! Ресурсы! Ресурсы!

В чем можно убедиться неоднократно, так это в том, что максимально ВСЕ нужно выносить в ресурсы. Начнем мы с цветов. Как минимум один цвет у нас уже есть – фон для кнопки. Выберем наш элемент Border, для которого он используется, и в редакторе цвета нажмем на ма-а-аленький квадратик Advanced property options (в результате обсуждений Expression Community, эту кнопку-точку принято называть Property Peg).

6

В меню выберем пункт Convert to New Resource, зададим ключ-название для цвета, например, Blue и разместим все в том же файле ресурсов. После этого в панели ресурсов появится новый элемент, а в xaml-файле  – строчка <Color x:Key="Blue">#FF308899</Color>. Заливка же фона для элемента Border преобразуется в следующую запись:

<Border.Background>
    <SolidColorBrush Color="{StaticResource Blue}"/>
</Border.Background>

Состояния

Как мы знаем, в панели States можно сделать настройки для всех состояний нашей кнопки. Например, для состояния MouseOver

7

мы изменим цвет заливки фона кнопки. Находясь в режиме записи состояния MouseOver, на панели Objects & Timeline выберем элемент Border и, переключив обратно на редактор цвета, изменяем голубой цвет на более темный. После чего этот цвет аналогично можно добавить в ресурсы с названием, например как в нашем случае, DarkBlue.

В xaml-коде состояние MouseOver будет выглядеть так:

<VisualState x:Name="MouseOver">
     <Storyboard>
          <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" Storyboard.TargetName="Blue">
                  <EasingColorKeyFrame KeyTime="0" Value="{StaticResource DarkBlue}"/>
          </ColorAnimationUsingKeyFrames>
     </Storyboard>
</VisualState>       

Аналогичные действия можно сделать и для состояния Pressed, а для Disabled – понизить прозрачность фона до 30%:

<VisualState x:Name="Disabled">
   <Storyboard>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="Blue">
              <EasingDoubleKeyFrame KeyTime="0" Value="0.3"/>
        </DoubleAnimationUsingKeyFrames>
   </Storyboard>
</VisualState>

Для состояния Focused – можно сделать границу для Border размером 1, а в качестве цвета для нее выбрать ресурс DarkBlue. Все это делается визуально в режиме записи состояния. А код получается следующим:

<VisualState x:Name="Focused">
    <Storyboard>
        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderThickness)" Storyboard.TargetName="Blue">
              <DiscreteObjectKeyFrame KeyTime="0">
                   <DiscreteObjectKeyFrame.Value>
                        <Thickness>1</Thickness>
                   </DiscreteObjectKeyFrame.Value>
              </DiscreteObjectKeyFrame>
        </ObjectAnimationUsingKeyFrames>
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="Blue">
              <EasingColorKeyFrame KeyTime="0" Value="{StaticResource DarkBlue}"/>
        </ColorAnimationUsingKeyFrames>
    </Storyboard>
</VisualState>

Оптимизация – основа всего

Думаете, на этом минимальные действия над стилизацией кнопки закончены? Отнудь нет. Как мы уже выяснили – все нужно выносить в ресурсы. У нас еще остались свойства, которые можно оптимизировать.

Например, у элемента Border нашей кнопке есть два свойства, одно из которых – CornerRadius, а второе – Padding. Очень логично, что при создании следующих стилей, например, для текстового блока, скроллинга и других, Вы не будете использовать совсем новые значения для закругления углов и внутренних отступов для контента.

9

Поэтому выносим их тоже. Из практики, я обычно для таких свойств создаю еще один файл ресурсов - Thickness.xaml, в котором храню только отступы,  толщины границ, радиусы закругления и прочие общие значения, которые удобно менять в одном файле единоразово.

10

После этого привязка к значениям выглядит так:

11

а в файле Thickness.xaml у нас есть две строчки:

<Thickness x:Key="Padding">10,5</Thickness>
    <CornerRadius x:Key="CornerRadius">5</CornerRadius>

Как Вы уже догадались, эти значения можно менять через панель Resources, что, согласитесь, очень удобно.

12

Как применить стили?

Ну и наконец, полученный нами стиль применяется автоматом, без указания каких-либо ключей - для всех новосозданных кнопок.

13

Стили по ключу – в силе

Никто не отменял стили с заданием по ключу. Вы можете создавать и использовать их для отдельных элементов, которые необходимо выделить. Например, указав  для нового создаваемого стиля x:Key, 
<Style x:Key="CancelButton" TargetType="Button"> ...

мы можем для отдельной кнопки применить его старым методом

<Button Content="Button" HorizontalAlignment="Center" VerticalAlignment="Center" Style="{StaticResource CancelButton}"/>

14

Posted: Tuesday, December 01, 2009 11:16 AM від Helen

Коментарі

IgorK сказав:

+1 вещь для Silverlight, которая и так была в WPF :) Интересно, чем это кончится через пару лет...

# December 1, 2009 4:39 AM

Helen сказав:

to IgorK: предполагаю, что будет что-то одно обобщенное :)

# December 1, 2009 8:19 AM

progg.ru сказав:

Thank you for submitting this cool story - Trackback from progg.ru

# December 1, 2009 9:47 AM

devildev сказав:

Подскажите, пожалуйста, почему у меня при назначении цвета из ресурсов рушится вся анимация (к текущему и предидущим состояним автоматически присваивается цвет-ресурс)?

# January 5, 2010 12:34 AM
Анонімні коментарі деактивовані. Увійдіть або Зареєструйтесь щоб мати доступ до ресурсів Спільноти.