较少使用的标记扩展
三个标记扩展名的使用量与其他扩展名不同。 这些是:
-
x:Null
-
x:Type
-
x:Array
您使用x:Null扩展名将属性设置为null。 语法如下所示:
-
<SomeElement SomeProperty="{x:Null}" />
这没有多大意义,除非SomeProperty的默认值不为null,因为它可以将属性设置为null。 但正如您将在第12章中看到的,有时属性可以从样式中获取非null值,而x:Null几乎是覆盖它的唯一方法。
x:Type标记扩展用于设置Type类型的属性,.NET类描述类或结构的类型。 这是语法:
-
<AnotherElement TypeProperty="{x:Type Color}" />
您还将使用x:与x:Array连接。 x:Array标记扩展始终使用常规元素语法而不是大括号语法。 它有一个名为Type的必需参数,您可以使用x:Type标记扩展名进行设置。 这表示数组中元素的类型。这是如何在资源字典中定义数组:
-
<x:Array x:Key="array"
-
Type="{x:Type x:String}">
-
<x:String>One String</x:String>
-
<x:String>Two String</x:String>
-
<x:String>Red String</x:String>
-
<x:String>Blue String</x:String>
-
</x:Array>
自定义标记扩展
让我们创建一个名为HslColorExtension的标记扩展。 这将允许我们通过指定色调,饱和度和亮度的值来设置Color类型的任何属性,但是比使用第8章“代码和XAML协调”中演示的x:FactoryMethod标记简单得多。
此外,让我们将这个类放在一个单独的可移植类库中,以便您可以从多个应用程序中使用它。 可以在本书的其他源代码中找到这样的库。 它位于名为Libraries的目录中,与单独的章节目录并行。 此PCL的名称(以及其中的类的名称空间)是Xamarin.FormsBook.Toolkit。
您可以在自己的应用程序中自行使用此库,方法是添加对它的引用。 然后,您可以在XAML文件中添加新的XML命名空间声明,以便指定此库:
-
xmlns:toolkit="clr-namespace:Xamarin.FormsBook.Toolkit;assembly=Xamarin.FormsBook.Toolkit"
使用此工具包前缀,您可以像使用其他XAML标记扩展一样引用HslColorExtension类:
-
<BoxView Color="{toolkit:HslColor H=0.67, S=1, L=0.5}" />
与目前为止显示的其他XAML标记扩展不同,此扩展具有多个属性,如果您将它们设置为带有大括号语法的参数,则必须用逗号分隔它们。
这样的东西会有用吗? 让我们首先看看如何为要在应用程序之间共享的类创建这样的库:
在Visual Studio中,从“文件”菜单中选择“新建”和“项目”。 在New Project对话框中,选择左侧的Visual C#和Cross-Platform,以及列表中的Class Library(Xamarin.Forms)。 找到项目的位置并为其命名。 对于为此示例创建的PCL,名称为Xamarin.FormsBook.Toolkit。 单击确定。 除了项目的所有开销外,模板还创建了一个名为Xamarin.FormsBook.Toolkit.cs的代码文件,其中包含一个名为Xamarin.Forms?Book.Toolkit的类。 那不是有效的类名,所以只需删除该文件即可。
在Xamarin Studio中,从“文件”菜单中选择“新建”和“解决方案”。 在“新建项目”对话框中,选择左侧的“多平台和库”,然后从列表中选择“表单和类库”。 找到它的位置并为其命名(本例中为Xamarin.FormsBook.Toolkit)。 单击确定。 解决方案模板创建多个文件,包括名为MyPage.cs的文件。 删除该文件。
您现在可以以正常方式向此项目添加类:
在Visual Studio中,右键单击项目名称,选择“添加”和“新建项”。 在Add New Item dialog中,如果您只是创建一个仅代码类,请在左侧选择Visual C#和Code,然后从列表中选择Class。 给它一个名字(本例中为HslColorExtension.cs)。 单击“添加”按钮。
在Xamarin Studio中,在项目的工具菜单中,选择“添加”和“新建文件”。 在New File dia?log中,如果您只是创建一个仅代码类,请选择左侧的General和列表中的Empty Class。 给它一个名字(本例中为HslColorExtension.cs)。 单击“新建”按钮。
在本书的过程中,将构建Xamarin.FormsBook.Toolkit库并积累有用的类。 但是这个库中的第一个类是HslColorExtension。 HslColorExtension.cs文件(包括所需的using指令)如下所示:
-
using System;
-
using Xamarin.Forms;
-
using Xamarin.Forms.Xaml;
-
namespace Xamarin.FormsBook.Toolkit
-
{
-
public class HslColorExtension : IMarkupExtension
-
{
-
public HslColorExtension()
-
{
-
A = 1;
-
}
-
public double H { set; get; }
-
public double S { set; get; }
-
public double L { set; get; }
-
public double A { set; get; }
-
public object ProvideValue(IServiceProvider serviceProvider)
-
{
-
return Color.FromHsla(H, S, L, A);
-
}
-
}
-
}
请注意,该类是公共的,因此它可以从库外部看到,并且它实现了IMarkupExtension接口,这意味着它必须包含ProvideValue方法。 但是,该方法根本不使用IServiceProvider参数,主要是因为它不需要知道自身外部的任何其他内容。 它需要的只是创建Color值的四个属性,如果未设置A值,则使用默认值1(完全不透明)。
这个Xamarin.FormsBook.Toolkit解决方案只包含一个PCL项目。 可以构建项目以生成PCL程序集,但如果没有使用此程序集的应用程序,则无法运行该项目。
从应用程序解决方案访问此库有两种方法:
-
从应用程序解决方案的PCL项目中,添加对库PCL程序集的引用,该库是从库项目生成的动态链接库(DLL)。
-
从应用程序解决方案中包含指向库项目的链接,并从应用程序的PCL项目添加对该库项目的引用。
如果您只有DLL而不是包含源代码的项目,则第一个选项是必需的。也许您正在许可库并且无法访问源。但是,如果您有权访问该项目,通常最好在解决方案中包含指向库项目的链接,以便您可以轻松地更改库代码并重建库项目。
本章的最后一个项目是CustomExtensionDemo,它使用新库中的HslColorExtension类。 CustomExtensionDemo解决方案包含指向Xamarin.FormsBook.Toolkit PCL项目的链接,CustomExtensionDemo专业版中的References部分列出了Xamarin.FormsBook.Toolkit程序集。
现在,应用程序项目似乎已准备好访问库项目,以便在应用程序的XAML文件中使用HslColorExtension类。
但首先是另一步。除非您已启用XAML编译,否则从XAML引用外部库不足以确保该库包含在应用程序中。需要从实际代码访问库。出于这个原因,Xamarin.FormsBook.Toolkit还包含一个类和方法,可能从名称中看起来正在为library执行重要的初始化:
-
namespace Xamarin.FormsBook.Toolkit
-
{
-
public static class Toolkit
-
{
-
public static void Init()
-
{
-
}
-
}
-
}
每当你使用这个库中的任何东西时,试着养成在App文件中首先调用这个Init方法的习惯:
-
namespace CustomExtensionDemo
-
{
-
public class App : Application
-
{
-
public App()
-
{
-
Xamarin.FormsBook.Toolkit.Toolkit.Init();
-
MainPage = new CustomExtensionDemoPage();
-
}
-
...
-
}
-
}
以下XAML文件显示Xamarin.Forms?Book.Toolkit库的XML名称空间声明以及访问自定义XAML标记扩展的三种方法 - 使用在Color属性上使用property-element语法设置的HslColorExtension元素并使用两个HslColorExtension 和HslColor使用更常见的大括号语法。 再次注意使用逗号分隔花括号内的参数:
-
<ContentPage xmlns=""
-
xmlns:x=""
-
xmlns:toolkit=
-
"clr-namespace:Xamarin.FormsBook.Toolkit;assembly=Xamarin.FormsBook.Toolkit"
-
x:Class="CustomExtensionDemo.CustomExtensionDemoPage">
-
<StackLayout>
-
<!-- Red -->
-
<BoxView HorizontalOptions="Center"
-
VerticalOptions="CenterAndExpand">
-
<BoxView.Color>
-
<toolkit:HslColorExtension H="0" S="1" L="0.5" />
-
</BoxView.Color>
-
</BoxView>
-
-
<!-- Green -->
-
<BoxView HorizontalOptions="Center"
-
VerticalOptions="CenterAndExpand">
-
<BoxView.Color>
-
<toolkit:HslColorExtension H="0.33" S="1" L="0.5" />
-
</BoxView.Color>
-
</BoxView>
-
-
<!-- Blue -->
-
<BoxView Color="{toolkit:HslColor H=0.67, S=1, L=0.5}"
-
HorizontalOptions="Center"
-
VerticalOptions="CenterAndExpand" />
-
-
<!-- Gray -->
-
<BoxView Color="{toolkit:HslColor H=0, S=0, L=0.5}"
-
HorizontalOptions="Center"
-
VerticalOptions="CenterAndExpand" />
-
-
<!-— Semitransparent white -->
-
<BoxView Color="{toolkit:HslColor H=0, S=0, L=1, A=0.5}"
-
HorizontalOptions="Center"
-
VerticalOptions="CenterAndExpand" />
-
-
<!-- Semitransparent black -->
-
<BoxView Color="{toolkit:HslColor H=0, S=0, L=0, A=0.5}"
-
HorizontalOptions="Center"
-
VerticalOptions="CenterAndExpand" />
-
</StackLayout>
-
</ContentPage>
最后两个示例将A属性设置为50%透明度,因此框显示为灰色阴影(或根本不显示),具体取决于背景:
XAML标记扩展的两个主要用途尚未到来。 在第12章中,您将看到Style类,毫无疑问是包含在资源字典中的最受欢迎的项目,在第16章中,您将看到名为Binding的强大标记扩展。
阅读(2356) | 评论(0) | 转发(0) |