Сводная информация о главе 12. Стили

Download Sample Скачайте пример

Примечание.

Эта книга была опубликована весной 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:

Triple screenshot of basic style

Объект 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 и могут использоваться в качестве ключей словаря для динамических стилей:

Эти стили иллюстрируются в примере DeviceStylesList.