第十章:XAML标记扩展(六)

简介:

较少使用的标记扩展

三个标记扩展名的使用量与其他扩展名不同。 这些是:

  • 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 dia?log中,如果您只是创建一个仅代码类,请在左侧选择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="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             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%透明度,因此框显示为灰色阴影(或根本不显示),具体取决于背景:
201807302121310357
XAML标记扩展的两个主要用途尚未到来。 在第12章中,您将看到Style类,毫无疑问是包含在资源字典中的最受欢迎的项目,在第16章中,您将看到名为Binding的强大标记扩展。

目录
相关文章
【自然框架】内部类库、控件的引用关系(最新整理,基本稳定)
  和以前相比,减少了一个项目,把Control_Interface合并到CommonFunction里面。这样引用关系就简单多了。   基本上分为三个层次:类库、自定义控件、页面基类。其中的 MetaData 负责元数据的定义和加载。
638 0
|
C# Windows
WPF中如何选择合适的元数据标记?(英文)
原文:WPF中如何选择合适的元数据标记?(英文) FrameworkPropertyMetadataOptions Enumeration:Specifies the types of framework-level p...
950 0
|
JavaScript 数据可视化 Android开发
|
存储 JavaScript Android开发
第十章:XAML标记扩展(三)
资源词典 Xamarin.Forms还支持第二种共享对象和值的方法,虽然这种方法比x:静态标记扩展稍微有点开销,但它更通用 - 因为所有东西 - 共享对象和使用的可视元素 它们 - 可以用XAML表示。
1175 0
|
XML JavaScript Android开发
第十章:XAML标记扩展(二)
访问静态成员 IMarkupExtension最简单和最有用的实现之一封装在StaticExtension类中。 这是原始XAML规范的一部分,因此它通常出现在带有x前缀的XAML中。 StaticExtension定义了一个名为Member of string的属性,您可以将其设置为公共常量,静态属性,静态字段或枚举成员的类和成员名称。
1047 0
|
JavaScript Android开发 Windows
|
JavaScript Android开发 索引
第八章:代码和XAML协调一致5
点按手势 Xamarin.Forms按钮响应手指点击,但您实际上可以从任何派生自View的类中获取手指点击,包括Label,BoxView和Frame。 这些点击事件不会内置到View类中,但View类会定义名为GestureRecognizers的属性。
1307 0
|
XML JavaScript Android开发