Сводная информация о главе 12. Стили
Примечание.
Эта книга была опубликована весной 2016 года и с тех пор не обновлялась. Многое в этой книге остается ценным, но некоторые материалы устарели, а некоторые разделы перестали быть полностью верными или полными.
В Xamarin.Forms стили позволяют нескольким представлениям совместно использовать коллекцию параметров свойств. Это сокращает разметку и позволяет поддерживать единообразные визуальные темы.
Стили почти всегда определяются и используются в разметке. Объект типа Style
создается в словаре ресурсов, а затем устанавливается в свойство визуального элемента Style
с помощью расширения разметки StaticResource
или DynamicResource
.
Базовый стиль
Требуется Style
, чтобы его TargetType
можно было задать для типа визуального объекта, к которому он применяется. При создании экземпляра Style
в словаре ресурсов (как и обычно) для него также требуется атрибут x:Key
.
Style
имеет свойство содержимого типа Setters
, которое представляет собой коллекцию объектов Setter
. Каждый Setter
связывает Property
с Value
.
В XAML параметр Property
— это имя свойства CLR (например, свойство Text
объекта Button
), однако свойство со стилем должно быть включено в свойство, доступное для привязки. Кроме того, свойство должно быть определено в классе, указанном параметром TargetType
, или унаследовано этим классом.
Параметр Value
можно указать с помощью элемента свойства <Setter.Value>
. Это позволяет задать Value
для объекта, который не может быть выражен в текстовой строке, в объекте OnPlatform
или в объекте, созданном с помощью x:Arguments
или x:FactoryMethod
. Свойство Value
для другого элемента в словаре также можно задать выражением StaticResource
.
Программа BasicStyle демонстрирует базовый синтаксис и показывает, как ссылаться на Style
с помощью расширения разметки StaticResource
:
Объект Style
и любой объект, созданный в объекте Style
в качестве параметра Value
, являются общими для всех представлений, ссылающихся на этот Style
. Style
не может содержать все, что нельзя использовать совместно, например производный View
.
Обработчики событий не могут быть заданы в Style
. Свойство GestureRecognizers
нельзя задать в Style
, поскольку оно не поддерживается привязываемым свойством.
Стили в коде
Хотя это и не является распространенным, объекты Style
можно создавать и инициализировать в коде. Это продемонстрировано в примере BasicStyleCode.
Наследование стилей
Style
имеет свойство BasedOn
, которое можно задать для расширения разметки StaticResource
, ссылающейся на другой стиль. Это позволяет стилям наследовать предыдущие стили, а также добавлять или заменять параметры свойств. Это показано в примере StyleInheritance.
Если Style2
основан на Style1
, то TargetType
из Style2
должен быть таким же, как Style1
, или производным от Style1
. Словарь ресурсов, в котором хранится Style1
, должен иметь тот же словарь ресурсов, что и Style2
, или словарь ресурсов, находящийся выше в визуальном дереве.
Неявные стили
Если Style
в словаре ресурсов не содержит атрибут x:Key
, ему автоматически присваивается ключ словаря, а объект Style
становится неявным стилем. Представление без параметра Style
, тип которого соответствует TargetType
, точно будет находить этот стиль, как показывает пример ImplicitStyle.
Неявный стиль может быть производным от Style
с параметром x:Key
, но не наоборот. Нельзя явно ссылаться на неявный стиль.
Вы можете реализовать три типа иерархии со стилями и BasedOn
:
- Из стилей, определенных в
Application
иPage
, к стилям, определенным в макетах ниже в визуальном дереве. - Из стилей, определенных для базовых классов, таких как
VisualElement
иView
, к стилям, определенным для конкретных классов. - Из стилей с явными ключами словаря к неявным стилям.
Эти иерархии демонстрируются в примере StyleHierarchy.
Динамические стили
На стиль в ресурсном словаре можно ссылаться не на StaticResource
, а на DynamicResource
. Это делает стиль динамическим стилем. Если этот стиль заменяется в словаре ресурсов другим стилем с тем же ключом, представления, ссылающиеся на этот стиль DynamicResource
, автоматически меняются. Кроме того, отсутствие записи словаря с указанным ключом приведет к тому, что StaticResource
вызовет исключение, но не DynamicResource
.
Эту методику можно использовать для динамического изменения стилей или тем, как показывает пример DynamicStyles.
Однако для свойства BasedOn
нельзя задать расширение составных частей DynamicResource
, поскольку BasedOn
не поддерживается связываемыми свойствами. Чтобы сделать стиль динамически производным, не устанавливайте BasedOn
. Вместо этого присвойте свойству BaseResourceKey
ключ словаря стиля, от которого требуется выполнить наследование. Этот метод демонстрируется в примере DynamicStylesInheritance.
Стили устройства
Вложенный класс Device.Styles
определяет двенадцать статических полей, предназначенных только для чтения, для шести стилей с TargetType
из Label
, которые можно использовать для общих типов использования текста.
Шесть из этих полей имеют тип Style
, который можно задать непосредственно для свойства Style
в коде:
Другие шесть полей относятся к типу string
и могут использоваться в качестве ключей словаря для динамических стилей:
BodyStyleKey
равно "BodyStyle"TitleStyleKey
равно "TitleStyle"SubtitleStyleKey
равно "SubtitleStyle"CaptionStyleKey
равно "CaptionStyle"ListItemTextStyleKey
равно "ListItemTextStyle"ListItemDetailTextStyleKey
равно "ListItemDetailTextStyle"
Эти стили иллюстрируются в примере DeviceStylesList.