隐藏

【Xamarin.Forms】附加属性——创建可在任何对象上设置的全局属性

发布:2021/10/25 17:38:51作者:管理员 来源:本站 浏览次数:1119

附加属性是一种特殊类型的可绑定属性,在一个类中定义,但附加到其他对象,在XAML中可识别为包含由句点分隔的类和属性名称的属性。 本文介绍附加的属性,并演示如何创建和使用它们。

概观

附加属性使对象能够为其自己的类未定义的属性赋值。 例如,子元素可以使用附加的属性来通知他们的父元素如何在用户界面中呈现它们。 网格控件允许通过设置Grid.Row和Grid.Column附属属性来指定子节点的行和列。 Grid.Row和Grid.Column是附加属性,因为它们是在网格的子元素上设置的,而不是在网格上。
可绑定属性应在以下情况下作为附加属性实现:


  • 当需要为定义类以外的类提供属性设置机制时。
  • 当班级代表需要与其他班级轻松整合的服务时。

有关可绑定属性的更多信息,请参见可绑定属性。

创建和使用附加属性

创建附加属性的过程如下所示:

  1. 使用CreateAttached方法重载之一创建一个BindableProperty实例。
  2. 提供静态GetPropertyName和SetPropertyName方法作为附加属性的访问器。

创建一个属性

创建附加属性以用于其他类型时,创建属性的类不必从BindableObject派生。 但是,访问者的目标属性应该是BindableObject或来自BindableObject。
可以通过声明BindableProperty类型的公共静态只读属性来创建附加属性。 可绑定属性应设置为BindableProperty.CreateAttached方法重载之一的返回值。 声明应该在所属类的主体之内,但不在任何成员定义之内。
以下代码显示了附加属性的示例:

点击(此处)折叠或打开

  1. public static readonly BindableProperty HasShadowProperty =
  2.   BindableProperty.CreateAttached ("HasShadow", typeof(bool), typeof(ShadowEffect), false);
这将创建一个名为HasShadow的类型为bool的附加属性。 该属性由ShadowEffect类拥有,并具有默认值false。 附加属性的命名约定是附加属性标识符必须与CreateAttached方法中指定的属性名称相匹配,并附加“Property”。 因此,在上面的示例中,附加的属性标识符是HasShadowProperty。
有关创建可绑定属性(包括可在创建期间指定的参数)的更多信息,请参阅创建和使用可绑定属性。



创建访问器

需要静态GetPropertyName和SetPropertyName方法作为附加属性的访问器,否则属性系统将无法使用附加属性。 GetPropertyName访问器应符合以下签名:

点击(此处)折叠或打开

  1. public static valueType GetPropertyName(BindableObject target)
GetPropertyName访问器应该返回包含在相应BindableProperty字段中的附加属性的值。 这可以通过调用GetValue方法,传入可获取值的可绑定属性标识符,然后将结果值转换为所需的类型来实现。
SetPropertyName访问器应符合以下签名:

点击(此处)折叠或打开

  1. public static void SetPropertyName(BindableObject target, valueType value)

SetPropertyName访问器应该为附加属性设置相应的BindableProperty字段的值。 这可以通过调用SetValue方法,传入要设置值的可绑定属性标识符以及要设置的值来实现。
对于这两个访问器,目标对象应该是BindableObject或从BindableObject派生。
下面的代码示例显示了HasShadow附加属性的访问器:

点击(此处)折叠或打开

  1. public static bool GetHasShadow (BindableObject view)
  2. {
  3.   return (bool)view.GetValue (HasShadowProperty);
  4. }

  5. public static void SetHasShadow (BindableObject view, bool value)
  6. {
  7.   view.SetValue (HasShadowProperty, value);
  8. }


使用附加财产

一旦创建了附加属性,就可以从XAML或代码中使用它。 在XAML中,这是通过声明一个带有前缀的名称空间来实现的,其中名称空间声明指示公共语言运行时(CLR)名称空间名称,以及可选的程序集名称。 有关更多信息,请参阅XAML命名空间。
以下代码示例演示了包含附加属性的自定义类型的XAML名称空间,该属性在与引用自定义类型的应用程序代码相同的程序集中定义:

点击(此处)折叠或打开

  1. <ContentPage ... xmlns:local="clr-namespace:EffectsDemo" ...>
  2.   ...
  3. </ContentPage>
然后,在特定控件上设置附加属性时使用该命名空间声明,如下面的XAML代码示例所示:

点击(此处)折叠或打开

  1. <Label Text="Label Shadow Effect" local:ShadowEffect.HasShadow="true" />
下面的代码示例中显示了等效的C#代码:

点击(此处)折叠或打开

  1. var label = new Label { Text = "Label Shadow Effect" };
  2. ShadowEffect.SetHasShadow (label, true);


在样式中使用附加属性

附加属性也可以通过样式添加到控件中。 以下XAML代码示例显示了使用HasShadow附加属性的显式样式,该样式可应用于Label控件:

点击(此处)折叠或打开

  1. <Style x:Key="ShadowEffectStyle" TargetType="Label">
  2.   <Style.Setters>
  3.     <Setter Property="local:ShadowEffect.HasShadow" Value="true" />
  4.   </Style.Setters>
  5. </Style>
通过使用StaticResource标记扩展将Style属性设置为Style实例,可以将Style应用于Label,如以下代码示例所示:

点击(此处)折叠或打开

  1. <Label Text="Label Shadow Effect" Style="{StaticResource ShadowEffectStyle}" />
有关样式的更多信息,请参阅样式。



高级方案

创建附加属性时,可以设置一些可选参数,以启用高级附加属性方案。 这包括检测属性更改,验证属性值和强制属性值。 有关更多信息,请参阅高级方案。

概要

本文提供了附加属性的介绍,并演示了如何创建和使用它们。 附加属性是一种特殊类型的可绑定属性,在一个类中定义,但附加到其他对象,在XAML中可识别为包含由句点分隔的类和属性名称的属性。