Неявные стили в 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 };