Неявные стили в Xamarin.Forms
Неявный стиль — это стиль, используемый всеми элементами управления одного и того же TargetType, без необходимости ссылаться на стиль каждого элемента управления.
Создание неявного стиля в XAML
Чтобы объявить на Style
уровне страницы, ResourceDictionary
необходимо добавить на страницу, а затем в него можно включить ResourceDictionary
одно или несколько Style
объявлений. Объект Style
создается неявным путем указания атрибута x:Key
. Затем стиль будет применен к визуальным элементам, которые соответствуют TargetType
точно, но не к элементам, производным от TargetType
значения.
В следующем примере кода показан неявный стиль, объявленный в XAML на странице ResourceDictionary
и примененный к экземплярам страницыEntry
:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:Styles;assembly=Styles" x:Class="Styles.ImplicitStylesPage" Title="Implicit" IconImageSource="xaml.png">
<ContentPage.Resources>
<ResourceDictionary>
<Style TargetType="Entry">
<Setter Property="HorizontalOptions" Value="Fill" />
<Setter Property="VerticalOptions" Value="CenterAndExpand" />
<Setter Property="BackgroundColor" Value="Yellow" />
<Setter Property="FontAttributes" Value="Italic" />
<Setter Property="TextColor" Value="Blue" />
</Style>
</ResourceDictionary>
</ContentPage.Resources>
<ContentPage.Content>
<StackLayout Padding="0,20,0,0">
<Entry Text="These entries" />
<Entry Text="are demonstrating" />
<Entry Text="implicit styles," />
<Entry Text="and an implicit style override" BackgroundColor="Lime" TextColor="Red" />
<local:CustomEntry Text="Subclassed Entry is not receiving the style" />
</StackLayout>
</ContentPage.Content>
</ContentPage>
Определяет ResourceDictionary
один неявный стиль, применяемый к экземплярам страницы Entry
. Используется Style
для отображения синего текста на желтом фоне, а также настройки других параметров внешнего вида. Он Style
добавляется в страницу ResourceDictionary
без указания атрибута x:Key
. Поэтому применяется Style
ко всем Entry
экземплярам неявно, так как они соответствуют TargetType
свойству точного Style
. Однако он Style
не применяется к CustomEntry
экземпляру, который является подклассом Entry
. Результат показан на следующих снимках экрана:
Кроме того, четвертый Entry
переопределяет BackgroundColor
свойства TextColor
неявного стиля на разные Color
значения.
Создание неявного стиля на уровне элемента управления
Помимо создания неявных стилей на уровне страницы, их также можно создать на уровне элемента управления, как показано в следующем примере кода:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:Styles;assembly=Styles" x:Class="Styles.ImplicitStylesPage" Title="Implicit" IconImageSource="xaml.png">
<ContentPage.Content>
<StackLayout Padding="0,20,0,0">
<StackLayout.Resources>
<ResourceDictionary>
<Style TargetType="Entry">
<Setter Property="HorizontalOptions" Value="Fill" />
...
</Style>
</ResourceDictionary>
</StackLayout.Resources>
<Entry Text="These entries" />
...
</StackLayout>
</ContentPage.Content>
</ContentPage>
В этом примере неявное Style
назначается Resources
коллекции StackLayout
элемента управления. Затем неявный стиль можно применить к элементу управления и его дочерним элементам.
Сведения о создании стилей в приложении ResourceDictionary
см. в разделе "Глобальные стили".
Создание неявного стиля в C#
Style
Экземпляры можно добавить в коллекцию страниц Resources
в C# путем создания нового ResourceDictionary
экземпляра, а затем путем добавления Style
экземпляров в ResourceDictionary
коллекцию, как показано в следующем примере кода:
public class ImplicitStylesPageCS : ContentPage
{
public ImplicitStylesPageCS ()
{
var entryStyle = new Style (typeof(Entry)) {
Setters = {
...
new Setter { Property = Entry.TextColorProperty, Value = Color.Blue }
}
};
...
Resources = new ResourceDictionary ();
Resources.Add (entryStyle);
Content = new StackLayout {
Children = {
new Entry { Text = "These entries" },
new Entry { Text = "are demonstrating" },
new Entry { Text = "implicit styles," },
new Entry { Text = "and an implicit style override", BackgroundColor = Color.Lime, TextColor = Color.Red },
new CustomEntry { Text = "Subclassed Entry is not receiving the style" }
}
};
}
}
Конструктор определяет один неявный стиль, применяемый к экземплярам страницы Entry
. Используется Style
для отображения синего текста на желтом фоне, а также настройки других параметров внешнего вида. Он Style
добавляется в страницу ResourceDictionary
без указания key
строки. Поэтому применяется Style
ко всем Entry
экземплярам неявно, так как они соответствуют TargetType
свойству точного Style
. Однако он Style
не применяется к CustomEntry
экземпляру, который является подклассом Entry
.
Применение стиля к производным типам
Свойство Style.ApplyToDerivedTypes
позволяет применять стиль к элементам управления, производным от базового типа, на который TargetType
ссылается свойство. Таким образом, если задать это свойство, чтобы true
один стиль был предназначен для нескольких типов, при условии, что типы являются производными от базового типа, указанного в свойстве TargetType
.
В следующем примере показан неявный стиль, который задает цвет фона Button
экземпляров красным:
<Style TargetType="Button"
ApplyToDerivedTypes="True">
<Setter Property="BackgroundColor"
Value="Red" />
</Style>
Размещение этого стиля на уровне ResourceDictionary
страницы приведет к применению к всем Button
экземплярам на странице, а также к любым элементам управления, производным от Button
. Однако если ApplyToDerivedTypes
свойство осталось незамеченным, стиль будет применяться только к Button
экземплярам.
Эквивалентный код на C# выглядит так:
var buttonStyle = new Style(typeof(Button))
{
ApplyToDerivedTypes = true,
Setters =
{
new Setter
{
Property = VisualElement.BackgroundColorProperty,
Value = Color.Red
}
}
};
Resources = new ResourceDictionary { buttonStyle };