Практическое руководство. Использование хранилища метаданных
Обновлен: Ноябрь 2007
При использовании расширяемости среды для настройки Windows Presentation Foundation (WPF) для Visual Studio (конструктор), часто требуется создавать пользовательские элементы управления. Код для элементов управления и метаданных, определяющих поведение элементов управления во время разработки, разбивается и добавляется в разные сборки. Метаданные добавляются в хранилище MetadataStore. Дополнительные сведения см. в разделе Архитектура расширяемости конструктора WPF.
Хранилище метаданных содержит такие сведения о поведении во время разработки, как пользовательские графические элементы, пользовательские контекстные меню и пользовательские редакторы свойств. Хранилище метаданных реализовано в виде основанных на коде таблиц атрибутов.
![]() |
---|
Сборки метаданных загружаются в следующем порядке: сначала *.Design.dll, а затем *.VisualStudio.Design.dll или *.Expression.Design.dll. Это позволяет метаданным, зависящим от конструктора, перегружать общие метаданные. |
Добавление пользовательских таблиц атрибутов в хранилище метаданных
Когда конструктор загружает пользовательский элемент управления, он выполняет поиск типа в соответствующей сборке времени разработки, реализующей интерфейс IRegisterMetadata. После его обнаружения создается экземпляр типа и автоматически вызывается его метод Register.
Добавление пользовательских таблиц атрибутов в хранилище метаданных
В универсальную сборку времени разработки для элемента управления (<Ваш элемент управления>.Design.dll) добавьте файл с именем Metadata.cs или Metadata.vb.
В файле метаданных добавьте класс, реализующий интерфейс IRegisterMetadata, и реализуйте метод Register.
Создайте экземпляр объекта AttributeTableBuilder и для добавления к нему атрибутов вызовите метод AddCustomAttributes.
Вызовите метод AddAttributeTable для добавления таблицы атрибутов AttributeTable в хранилище метаданных.
Повторите шаги 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
См. также
Основные понятия
Ссылки
Другие ресурсы
Основные понятия расширяемости