Поделиться через


Практическое руководство. Использование хранилища метаданных

Обновлен: Ноябрь 2007

При использовании расширяемости среды для настройки Windows Presentation Foundation (WPF) для Visual Studio (конструктор), часто требуется создавать пользовательские элементы управления. Код для элементов управления и метаданных, определяющих поведение элементов управления во время разработки, разбивается и добавляется в разные сборки. Метаданные добавляются в хранилище MetadataStore. Дополнительные сведения см. в разделе Архитектура расширяемости конструктора WPF.

Хранилище метаданных содержит такие сведения о поведении во время разработки, как пользовательские графические элементы, пользовательские контекстные меню и пользовательские редакторы свойств. Хранилище метаданных реализовано в виде основанных на коде таблиц атрибутов.

Bb514529.alert_note(ru-ru,VS.90).gifПримечание.

Сборки метаданных загружаются в следующем порядке: сначала *.Design.dll, а затем *.VisualStudio.Design.dll или *.Expression.Design.dll. Это позволяет метаданным, зависящим от конструктора, перегружать общие метаданные.

Добавление пользовательских таблиц атрибутов в хранилище метаданных

Когда конструктор загружает пользовательский элемент управления, он выполняет поиск типа в соответствующей сборке времени разработки, реализующей интерфейс IRegisterMetadata. После его обнаружения создается экземпляр типа и автоматически вызывается его метод Register.

Добавление пользовательских таблиц атрибутов в хранилище метаданных

  1. В универсальную сборку времени разработки для элемента управления (<Ваш элемент управления>.Design.dll) добавьте файл с именем Metadata.cs или Metadata.vb.

  2. В файле метаданных добавьте класс, реализующий интерфейс IRegisterMetadata, и реализуйте метод Register.

  3. Создайте экземпляр объекта AttributeTableBuilder и для добавления к нему атрибутов вызовите метод AddCustomAttributes.

  4. Вызовите метод AddAttributeTable для добавления таблицы атрибутов AttributeTable в хранилище метаданных.

  5. Повторите шаги 1- 4 для зависящей от среды Visual Studio сборки времени разработки (<Ваш элемент управления>.VisualStudio.Design.dll).

Пример

В следующем примере добавляются метаданные для пользовательского элемента управления. В коде пользовательский редактор свойств подключается к свойству пользовательского элемента управления.

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

В следующем примере добавляются метаданные для пользовательского элемента управления. В коде пользовательские графические элементы и пользовательское контекстное меню подключаются к пользовательскому элементу управления.

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

См. также

Основные понятия

Хранилище метаданных

Ссылки

AdornerProvider

ContextMenuProvider

Другие ресурсы

Основные понятия расширяемости

Общее представление о расширяемости конструктора WPF

Расширяемость среды конструктора WPF