Явные стили в Xamarin.Forms
Явный стиль — это стиль, который выборочно применяется к элементам управления, задав их свойства стиля.
Создание явного стиля в XAML
Чтобы объявить на Style
уровне страницы, ResourceDictionary
необходимо добавить на страницу, а затем в него можно включить ResourceDictionary
одно или несколько Style
объявлений. Объект Style
делается явным путем предоставления его объявления x:Key
атрибута, который дает ему описательный ключ в ResourceDictionary
. Затем явные стили должны применяться к определенным визуальным элементам, задав их Style
свойства.
В следующем примере кода показаны явные стили, объявленные в XAML, в страницах и примененные к экземплярам страницы ResourceDictionary
Label
:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Styles.ExplicitStylesPage" Title="Explicit" IconImageSource="xaml.png">
<ContentPage.Resources>
<ResourceDictionary>
<Style x:Key="labelRedStyle" TargetType="Label">
<Setter Property="HorizontalOptions"
Value="Center" />
<Setter Property="VerticalOptions"
Value="CenterAndExpand" />
<Setter Property="FontSize" Value="Large" />
<Setter Property="TextColor" Value="Red" />
</Style>
<Style x:Key="labelGreenStyle" TargetType="Label">
...
<Setter Property="TextColor" Value="Green" />
</Style>
<Style x:Key="labelBlueStyle" TargetType="Label">
...
<Setter Property="TextColor" Value="Blue" />
</Style>
</ResourceDictionary>
</ContentPage.Resources>
<ContentPage.Content>
<StackLayout Padding="0,20,0,0">
<Label Text="These labels"
Style="{StaticResource labelRedStyle}" />
<Label Text="are demonstrating"
Style="{StaticResource labelGreenStyle}" />
<Label Text="explicit styles,"
Style="{StaticResource labelBlueStyle}" />
<Label Text="and an explicit style override"
Style="{StaticResource labelBlueStyle}"
TextColor="Teal" />
</StackLayout>
</ContentPage.Content>
</ContentPage>
Определяет ResourceDictionary
три явных стиля, применяемых к экземплярам страницы Label
. Каждый Style
используется для отображения текста в другом цвете, а также настройки размера шрифта и горизонтального и вертикального макета. Каждый из них Style
применяется к другому Label
, задав свойства Style
с помощью расширения разметки StaticResource
. Результат показан на следующих снимках экрана:
Кроме того, финал Label
применяется Style
к нему, но также переопределяет TextColor
свойство на другое Color
значение.
Создание явного стиля на уровне элемента управления
Помимо создания явных стилей на уровне страницы, их также можно создать на уровне элемента управления, как показано в следующем примере кода:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Styles.ExplicitStylesPage" Title="Explicit" IconImageSource="xaml.png">
<ContentPage.Content>
<StackLayout Padding="0,20,0,0">
<StackLayout.Resources>
<ResourceDictionary>
<Style x:Key="labelRedStyle" TargetType="Label">
...
</Style>
...
</ResourceDictionary>
</StackLayout.Resources>
<Label Text="These labels" Style="{StaticResource labelRedStyle}" />
...
</StackLayout>
</ContentPage.Content>
</ContentPage>
В этом примере явные Style
экземпляры назначаются Resources
коллекции StackLayout
элемента управления. Затем стили можно применить к элементу управления и его дочерним элементам.
Сведения о создании стилей в приложении ResourceDictionary
см. в разделе "Глобальные стили".
Создание явного стиля в C#
Style
Экземпляры можно добавить в коллекцию страниц Resources
в C# путем создания нового ResourceDictionary
экземпляра, а затем путем добавления Style
экземпляров в ResourceDictionary
коллекцию, как показано в следующем примере кода:
public class ExplicitStylesPageCS : ContentPage
{
public ExplicitStylesPageCS ()
{
var labelRedStyle = new Style (typeof(Label)) {
Setters = {
...
new Setter { Property = Label.TextColorProperty, Value = Color.Red }
}
};
var labelGreenStyle = new Style (typeof(Label)) {
Setters = {
...
new Setter { Property = Label.TextColorProperty, Value = Color.Green }
}
};
var labelBlueStyle = new Style (typeof(Label)) {
Setters = {
...
new Setter { Property = Label.TextColorProperty, Value = Color.Blue }
}
};
Resources = new ResourceDictionary ();
Resources.Add ("labelRedStyle", labelRedStyle);
Resources.Add ("labelGreenStyle", labelGreenStyle);
Resources.Add ("labelBlueStyle", labelBlueStyle);
...
Content = new StackLayout {
Children = {
new Label { Text = "These labels",
Style = (Style)Resources ["labelRedStyle"] },
new Label { Text = "are demonstrating",
Style = (Style)Resources ["labelGreenStyle"] },
new Label { Text = "explicit styles,",
Style = (Style)Resources ["labelBlueStyle"] },
new Label { Text = "and an explicit style override",
Style = (Style)Resources ["labelBlueStyle"], TextColor = Color.Teal }
}
};
}
}
Конструктор определяет три явных стиля, которые применяются к экземплярам страницы Label
. Каждый явный Style
добавляется в ResourceDictionary
метод с помощью Add
метода, указывая key
строку для ссылки на Style
экземпляр. Каждый из них Style
применяется к другому Label
, задав их Style
свойства.
Тем не менее, нет никакого ResourceDictionary
преимущества использовать здесь. Вместо этого Style
экземпляры можно назначить непосредственно Style
свойствам обязательных визуальных элементов и удалить их ResourceDictionary
, как показано в следующем примере кода:
public class ExplicitStylesPageCS : ContentPage
{
public ExplicitStylesPageCS ()
{
var labelRedStyle = new Style (typeof(Label)) {
...
};
var labelGreenStyle = new Style (typeof(Label)) {
...
};
var labelBlueStyle = new Style (typeof(Label)) {
...
};
...
Content = new StackLayout {
Children = {
new Label { Text = "These labels", Style = labelRedStyle },
new Label { Text = "are demonstrating", Style = labelGreenStyle },
new Label { Text = "explicit styles,", Style = labelBlueStyle },
new Label { Text = "and an explicit style override", Style = labelBlueStyle,
TextColor = Color.Teal }
}
};
}
}
Конструктор определяет три явных стиля, которые применяются к экземплярам страницы Label
. Каждый Style
используется для отображения текста в другом цвете, а также настройки размера шрифта и горизонтального и вертикального макета. Каждый из них Style
применяется к другому Label
, задав его Style
свойства. Кроме того, финал Label
применяется Style
к нему, но также переопределяет TextColor
свойство на другое Color
значение.