Xamarin.Forms应用程序通常包含具有相同属性设置的多个元素。例如,您可能有几个具有相同颜色,字体大小和布局选项的按钮。在代码中,您可以为循环中的多个按钮指定相同的属性,但在XAML中不能使用循环。如果您想避免大量重复标记,则需要另一种解决方案。
解决方案是Style类,它是在一个conient对象中合并的属性设置的集合。您可以将Style对象设置为从VisualElement派生的任何类的Style属性。通常,您将相同的Style对象应用于多个元素,并且样式在这些元素之间共享。
Style是在Xamarin.Forms应用程序中为视觉元素提供一致外观的主要工具。样式有助于减少XAML文件中的重复标记,并允许更轻松地更改和维护应用程序。
样式主要是考虑到XAML而设计的,它们可能不是在仅代码环境中发明的。但是,您将在本章中看到如何在代码中定义和使用样式,以及如何组合代码和标记以在运行时动态更改程序样式。
基本样式
在第10章“XAML标记扩展”中,您看到了三个包含大量相同标记的按钮。 他们又来了:
-
<StackLayout>
-
<Button Text=" Carpe diem "
-
HorizontalOptions="Center"
-
VerticalOptions="CenterAndExpand"
-
BorderWidth="3"
-
TextColor="Red"
-
FontSize="Large">
-
<Button.BackgroundColor>
-
<OnPlatform x:TypeArguments="Color"
-
Android="#404040" />
-
</Button.BackgroundColor>
-
<Button.BorderColor>
-
<OnPlatform x:TypeArguments="Color"
-
Android="White"
-
WinPhone="Black" />
-
</Button.BorderColor>
-
</Button>
-
<Button Text=" Sapere aude "
-
HorizontalOptions="Center"
-
VerticalOptions="CenterAndExpand"
-
BorderWidth="3"
-
TextColor="Red"
-
FontSize="Large">
-
<Button.BackgroundColor>
-
<OnPlatform x:TypeArguments="Color"
-
Android="#404040" />
-
</Button.BackgroundColor>
-
<Button.BorderColor>
-
<OnPlatform x:TypeArguments="Color"
-
Android="White"
-
WinPhone="Black" />
-
</Button.BorderColor>
-
</Button>
-
<Button Text=" Discere faciendo "
-
HorizontalOptions="Center"
-
VerticalOptions="CenterAndExpand"
-
BorderWidth="3"
-
TextColor="Red"
-
FontSize="Large">
-
<Button.BackgroundColor>
-
<OnPlatform x:TypeArguments="Color"
-
Android="#404040" />
-
</Button.BackgroundColor>
-
<Button.BorderColor>
-
<OnPlatform x:TypeArguments="Color"
-
Android="White"
-
WinPhone="Black" />
-
</Button.BorderColor>
-
</Button>
-
</StackLayout>
除Text属性外,所有三个按钮都具有相同的属性设置。
这个重复标记的一个部分解决方案涉及在资源分类中定义属性值并使用StaticResource标记扩展引用它们。 正如您在第10章的ResourceSharing项目中看到的,这种技术不会减少标记批量,但它确实在一个地方合并了值。
要减少标记批量,您需要一个样式。 Style对象几乎总是在ResourceDictionary中定义。 通常,您将从页面顶部的“资源”部分开始:
-
<ContentPage xmlns=""
-
xmlns:x=""
-
x:Class="BasicStyle.BasicStylePage">
-
-
<ContentPage.Resources>
-
<ResourceDictionary>
-
...
-
</ResourceDictionary>
-
</ContentPage.Resources>
-
...
-
</ContentPage>
使用单独的开始和结束标记实例化样式:
-
<ContentPage xmlns=""
-
xmlns:x=""
-
x:Class="BasicStyle.BasicStylePage">
-
-
<ContentPage.Resources>
-
<ResourceDictionary>
-
<Style x:Key="buttonStyle" TargetType="Button">
-
...
-
</Style>
-
</ResourceDictionary>
-
</ContentPage.Resources>
-
...
-
</ContentPage>
因为Style是ResourceDictionary中的对象,所以您需要一个x:Key属性来为其提供描述性字典键。 您还必须设置TargetType属性。 这是样式设计的可视元素的类型,在本例中为Button。
正如您将在本章的下一部分中看到的那样,您还可以在代码中定义样式,在这种情况下,Style构造函数需要TargetType属性的Type类型的对象。 TargetType属性没有公共集访问器; 因此,在创建样式后无法更改TargetType属性。
Style还定义了另一个名为Setters的类型为IList 的重要get-only属性,它是Setter对象的集合。 每个Setter负责定义样式中的属性设置。 Setter类只定义了两个属性:
-
BindableProperty类型的属性
-
对象类型的值
阅读(2063) | 评论(0) | 转发(0) |