Comment : utiliser le magasin de métadonnées

Mise à jour : novembre 2007

Lorsque vous utilisez l'extensibilité pour personnaliser le Concepteur Windows Presentation Foundation (WPF) pour Visual Studio, vous créez souvent des contrôles personnalisés. Le code des contrôles et les métadonnées définissant le comportement au moment du design de vos contrôles sont pris en charge dans des assemblys distincts. En effet, les métadonnées sont prises en charge dans MetadataStore. Pour plus d'informations, consultez Architecture de l'extensibilité du concepteur WPF.

Le magasin de métadonnées contient des informations à propos du comportement au moment du design, comme les ornements personnalisés, les menus contextuels personnalisés et les éditeurs de propriétés personnalisés. Le magasin de métadonnées est implémenté dans des tables d'attributs basées sur du code.

Remarque :

Les assemblys de métadonnées sont chargés dans l'ordre suivant : *.Design.dll, puis *.VisualStudio.Design.dll ou *.Expression.Design.dll. Les métadonnées spécifiques du concepteur peuvent ainsi substituer les métadonnées communes partagées.

Ajout de tables d'attributs personnalisées au magasin de métadonnées

Lorsqu'un concepteur charge un contrôle personnalisé, il recherche un type dans l'assembly au moment du design correspondant qui implémente IRegisterMetadata. S'il le trouve, il instancie le type et appelle automatiquement sa méthode Register.

Pour ajouter des tables d'attributs personnalisées au magasin de métadonnées

  1. Dans l'assembly au moment du design général correspondant à votre contrôle (<Votre contrôle>.Design.dll), ajoutez un fichier nommé Metadata.cs ou Metadata.vb.

  2. Dans le fichier de métadonnées, ajoutez une classe qui implémente IRegisterMetadata et implémentez la méthode Register.

  3. Instanciez un objet AttributeTableBuilder et appelez la méthode AddCustomAttributes pour lui ajouter les attributs.

  4. Appelez la méthode AddAttributeTable pour ajouter AttributeTable au magasin de métadonnées.

  5. Répétez les étapes 1 à 4 pour l'assembly au moment du design spécifique de Visual Studio (<Votre contrôle>.VisualStudio.Design.dll).

Exemple

L'exemple suivant ajoute des métadonnées pour un contrôle personnalisé. Le code connecte un éditeur de propriétés personnalisé à une propriété du contrôle personnalisé.

internal class Metadata : Microsoft.Windows.Design.Metadata.IRegisterMetadata
{
    public void Register()
    {
        Microsoft.Windows.Design.Metadata.AttributeTableBuilder builder = new Microsoft.Windows.Design.Metadata.AttributeTableBuilder();

        //Property Editor
        builder.AddCustomAttributes(typeof(<Your Custom Control>), <Property>, new System.ComponentModel.EditorAttribute(typeof(<Your Custom Editor>), typeof(<Your Custom Editor>)));

        //Category Editor
        builder.AddCustomAttributes(typeof(<Your Custom Control>), new System.ComponentModel.EditorAttribute(typeof(<Your Custom Editor>), typeof(<Your Custom Editor>)));

        Microsoft.Windows.Design.Metadata.MetadataStore.AddAttributeTable(builder.CreateTable());
    }
}
Friend Class Metadata
    Implements Microsoft.Windows.Design.Metadata.IRegisterMetadata

    Public Sub Register() Implements Microsoft.Windows.Design.Metadata.IRegisterMetadata.Register

        Dim builder As New Microsoft.Windows.Design.Metadata.AttributeTableBuilder()

        'Property Editor
        builder.AddCustomAttributes(GetType(<Your Custom Control>), <Property>, New System.ComponentModel.EditorAttribute(GetType(<Your Custom Editor>), GetType(<Your Custom Editor>)))

        'Category Editor
        builder.AddCustomAttributes(GetType(<Your Custom Control>), New System.ComponentModel.EditorAttribute(GetType(<Your Custom Editor>), GetType(<Your Custom Editor>)))

        Microsoft.Windows.Design.Metadata.MetadataStore.AddAttributeTable(builder.CreateTable())
    End Sub
End Class

L'exemple suivant ajoute des métadonnées pour un contrôle personnalisé. Le code connecte des ornements personnalisés et un menu contextuel personnalisé au contrôle personnalisé.

internal class Metadata : Microsoft.Windows.Design.Metadata.IRegisterMetadata
{
    public void Register()
    {
        Microsoft.Windows.Design.Metadata.AttributeTableBuilder builder = new Microsoft.Windows.Design.Metadata.AttributeTableBuilder();

        //Adorners
        builder.AddCustomAttributes(typeof(<Your Custom Control>), new Microsoft.Windows.Design.Features.FeatureAttribute(typeof(<Your Custom Adorner Provider>)));
        builder.AddCustomAttributes(typeof(<Your Custom Control>), new Microsoft.Windows.Design.Features.FeatureAttribute(typeof(<Your Custom Adorner Provider>)));

        //MenuActions
        builder.AddCustomAttributes(typeof(<Your Custom Control>), new Microsoft.Windows.Design.Features.FeatureAttribute(typeof(<Your Custom Context Menu Provider>)));

        Microsoft.Windows.Design.Metadata.MetadataStore.AddAttributeTable(builder.CreateTable());
    }
}
Friend Class Metadata
    Implements Microsoft.Windows.Design.Metadata.IRegisterMetadata

    Public Sub Register() Implements Microsoft.Windows.Design.Metadata.IRegisterMetadata.Register

        Dim builder As New Microsoft.Windows.Design.Metadata.AttributeTableBuilder()

        'Adorners
        builder.AddCustomAttributes(GetType(<Your Custom Control>), New Microsoft.Windows.Design.Features.FeatureAttribute(GetType(<Your Custom Adorner Provider>)))
        builder.AddCustomAttributes(GetType(<Your Custom Control>), New Microsoft.Windows.Design.Features.FeatureAttribute(GetType(<Your Custom Adorner Provider>)))

        'MenuActions
        builder.AddCustomAttributes(GetType(<Your Custom Control>), New Microsoft.Windows.Design.Features.FeatureAttribute(GetType(<Your Custom Context Menu Provider>)))

        Microsoft.Windows.Design.Metadata.MetadataStore.AddAttributeTable(builder.CreateTable())
    End Sub
End Class

Voir aussi

Concepts

Magasin de métadonnées

Référence

AdornerProvider

ContextMenuProvider

Autres ressources

Concepts d'extensibilité de base

Fonctionnement de l'extensibilité du concepteur WPF

Extensibilité du concepteur WPF