如何注册附加属性 (WPF .NET)

本文介绍如何注册附加属性并提供公共访问器,以便通过 Extensible Application Markup Language (XAML) 和代码访问附加属性。 附加属性支持对任何 XAML 元素设置额外的属性/值对,即使该元素没有在其对象模型中定义这些额外的属性。 额外的属性可进行全局访问。 附加属性通常定义为没有常规属性包装器的依赖属性的专用形式。 Windows Presentation Foundation (WPF) 类型的大多数附加属性也作为依赖属性实现。 可以在任何 DependencyObject 派生类型上创建依赖属性。

重要

面向 .NET 7 和 .NET 6 的桌面指南文档正在撰写中。

示例

以下示例显示如何使用 RegisterAttached 方法将附加属性注册为依赖属性。 提供程序类可以选择在属性元数据中指定默认值。 有关属性元数据的详细信息,请参阅依赖属性元数据。 在此示例中,HasFish 属性具有 Boolean 值类型,其默认值设置为 false

附加属性的提供程序类必须提供遵循命名约定 Get<property name>Set<property name> 的静态 get/set 访问器方法。 XAML 读取器使用访问器识别附加属性的 XAML 特性,并将其值解析为适当的类型。 即使附加属性未注册为依赖属性,这些访问器也是必需的。

public class Aquarium : UIElement
{
    // Register an attached dependency property with the specified
    // property name, property type, owner type, and property metadata.
    public static readonly DependencyProperty HasFishProperty =
        DependencyProperty.RegisterAttached(
          "HasFish",
          typeof(bool),
          typeof(Aquarium),
          new FrameworkPropertyMetadata(defaultValue: false,
              flags: FrameworkPropertyMetadataOptions.AffectsRender)
        );

    // Declare a get accessor method.
    public static bool GetHasFish(UIElement target) =>
        (bool)target.GetValue(HasFishProperty);

    // Declare a set accessor method.
    public static void SetHasFish(UIElement target, bool value) =>
        target.SetValue(HasFishProperty, value);
}
Public Class Aquarium
    Inherits UIElement

    ' Register an attached dependency property with the specified
    ' property name, property type, owner type, and property metadata.
    Public Shared ReadOnly HasFishProperty As DependencyProperty =
        DependencyProperty.RegisterAttached("HasFish", GetType(Boolean), GetType(Aquarium),
            New FrameworkPropertyMetadata(defaultValue:=False,
                flags:=FrameworkPropertyMetadataOptions.AffectsRender))

    ' Declare a get accessor method.
    Public Shared Function GetHasFish(target As UIElement) As Boolean
        Return target.GetValue(HasFishProperty)
    End Function

    ' Declare a set accessor method.
    Public Shared Sub SetHasFish(target As UIElement, value As Boolean)
        target.SetValue(HasFishProperty, value)
    End Sub

End Class

另请参阅