Share via


AttributeTable Class

A table of metadata attributes for defining design-time appearance and behavior.

Namespace:  Microsoft.Windows.Design.Metadata
Assembly:  Microsoft.Windows.Design (in Microsoft.Windows.Design.dll)

Syntax

'Declaration
Public NotInheritable Class AttributeTable
'Usage
Dim instance As AttributeTable
public sealed class AttributeTable
public ref class AttributeTable sealed
public final class AttributeTable

Remarks

Use the AttributeTable class to associate design-time metadata attributes with Windows Presentation Foundation (WPF) types.

An attribute table is essentially a read-only dictionary, but its keys and values are computed separately. It is efficient to query an attribute table if it contains attributes for a particular type. The actual set of attributes is demand created.

To create an attribute table, call the CreateTable method of the AttributeTableBuilder class.

Examples

The following code example shows how to create and populate an attribute table. For more information, see Walkthrough: Creating a Design-time Adorner.

Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Reflection
Imports System.Text
Imports System.Windows.Media
Imports System.Windows.Controls
Imports System.Windows

Imports Microsoft.Windows.Design
Imports Microsoft.Windows.Design.Features
Imports Microsoft.Windows.Design.Metadata

' Container for any general design-time metadata to initialize. 
' Designers look for a type in the design-time assembly that  
' implements IRegisterMetadata. If found, designers instantiate  
' this class and call its Register() method automatically. 

Friend Class Metadata
    Implements IRegisterMetadata

    ' Called by the designer to register any design-time metadata. 
    Public Sub Register() Implements IRegisterMetadata.Register
        Dim builder As New AttributeTableBuilder()

        ' Apply the ReadOnlyAttribute to the Background property  
        ' of the Button class.
        builder.AddCustomAttributes(GetType(Button), "Background", New ReadOnlyAttribute(True))

        Dim attributes As AttributeTable = builder.CreateTable()

        MetadataStore.AddAttributeTable(attributes)

        Dim hasCustomAttributes As Boolean = attributes.ContainsAttributes(GetType(Button))

        Dim types As IEnumerable(Of Type) = attributes.AttributedTypes

        ' The following code shows how to retrieve custom attributes 
        ' using the GetCustomAttributes method overloads. 

        Dim attrs0 As IEnumerable = attributes.GetCustomAttributes(GetType(Button))

        Dim attrs1 As IEnumerable = attributes.GetCustomAttributes(GetType(Button), "Background")

        Dim properties As PropertyDescriptorCollection = TypeDescriptor.GetProperties(GetType(Button))
        Dim pd As PropertyDescriptor = properties("Background")
        Dim attrs2 As IEnumerable = attributes.GetCustomAttributes(GetType(Button), pd)

        Dim attrs3 As IEnumerable = attributes.GetCustomAttributes(GetType(Button), Button.BackgroundProperty)

        Dim members As MemberInfo() = GetType(Button).GetMembers()
        Dim i As Integer 
        For i = 0 To members.Length
            If members(i).Name = "Background" Then 
                Dim attrs4 As IEnumerable = attributes.GetCustomAttributes(GetType(Button), members(i))
            End If 
        Next i

    End Sub 

End Class
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
using System.Text;
using System.Windows.Media;
using System.Windows.Controls;
using System.Windows;

using Microsoft.Windows.Design.Features;
using Microsoft.Windows.Design.Metadata;

namespace CustomControlLibrary.VisualStudio.Design
{
    // Container for any general design-time metadata to initialize. 
    // Designers look for a type in the design-time assembly that  
    // implements IRegisterMetadata. If found, designers instantiate  
    // this class and call its Register() method automatically. 
    internal class Metadata : IRegisterMetadata
    {
        // Called by the designer to register any design-time metadata. 
        public void Register()
        {
            AttributeTableBuilder builder = new AttributeTableBuilder();

            // Apply the ReadOnlyAttribute to the Background property  
            // of the Button class.
            builder.AddCustomAttributes(
                typeof(Button),
                "Background",
                new ReadOnlyAttribute(true)  );

            AttributeTable attributes = builder.CreateTable();

            MetadataStore.AddAttributeTable(attributes);

            bool hasCustomAttributes = attributes.ContainsAttributes(typeof(Button));

            IEnumerable<Type> types = attributes.AttributedTypes;

            // The following code shows how to retrieve custom attributes 
            // using the GetCustomAttributes method overloads.

            IEnumerable attrs0 = attributes.GetCustomAttributes(typeof(Button));

            IEnumerable attrs1 = attributes.GetCustomAttributes(
                typeof(Button), 
                "Background");

            PropertyDescriptorCollection properties = 
                TypeDescriptor.GetProperties(typeof(Button));
            PropertyDescriptor pd = properties["Background"];
            IEnumerable attrs2 = attributes.GetCustomAttributes(typeof(Button), pd);

            IEnumerable attrs3 = attributes.GetCustomAttributes(
                typeof(Button),
                Button.BackgroundProperty);

            MemberInfo[] members = typeof(Button).GetMembers();
            for (int i = 0; i < members.Length; i+)
            {
                if (members[i].Name == "Background")
                {
                    IEnumerable attrs4 = attributes.GetCustomAttributes(
                        typeof(Button), 
                        members[i]);
                }
            }
        }
    }
}

Inheritance Hierarchy

System.Object
  Microsoft.Windows.Design.Metadata.AttributeTable

Thread Safety

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

See Also

Reference

AttributeTable Members

Microsoft.Windows.Design.Metadata Namespace

AttributeTableBuilder

Other Resources

Metadata Store