Загрузка кода XAML и свойства зависимостей
Текущая реализация WPF обработчика XAML изначально учитывает свойство зависимостей. Обработчик XAML WPF использует системные методы свойств для свойств зависимостей при загрузке двоичных атрибутов XAML и обработки атрибутов, которые являются свойствами зависимостей. При этом выполняется обход оболочек свойств. При реализации пользовательских свойств зависимостей необходимо учитывать такое поведение и избегать размещения в оболочке свойства любого другого кода, отличного от методов GetValue и SetValue системы свойств.
Необходимые компоненты
В этом разделе предполагается, что вы, как пользователь и разработчик, понимаете свойства зависимостей и ознакомились с разделами Общие сведения о свойствах зависимости и Пользовательские свойства зависимостей. Следует также прочитать разделы XAML в WPF и Подробное описание синтаксиса XAML.
Реализация загрузчика XAML WPF и производительность
С точки зрения реализации для определения свойства как свойства зависимости и для доступа к методу SetValue системы свойств требуется значительно меньше затрат вычислительных ресурсов, чем при использовании оболочки свойства и ее метода задания. Причина этого заключается в том, что процессору XAML требуется вывести всю объектную модель вспомогательного кода, основываясь только на сведениях о типе и связях между членами, которые определены структурой разметки и различными строками.
Поиск типа осуществляется посредством сочетания элементов XMLNS и атрибутов сборки, но для идентификации членов, определения тех членов, которые можно установить в качестве атрибута, и типов, поддерживаемых значениями свойств, требуется расширенное отражение с помощью объекта PropertyInfo. Так как свойства зависимостей данного типа доступны в виде таблицы хранилища с помощью системы свойств, WPF-реализация соответствующего процессора XAML использует эту таблицу и выводит, что любое данное свойство ABC может быть эффективнее задано путем вызова метода SetValue в содержащем его производном типе DependencyObject с использованием идентификатора свойства зависимости свойство_ABC.
Последствия использования пользовательских свойств зависимостей
Так как текущая WPF-реализация процессора XAML при установке свойства полностью обходит оболочки, не следует помещать дополнительную логику в определения метода set оболочки для пользовательского свойства зависимости. Если поместить такую логику в определение метода set, она не будет выполняться, когда свойство задается в XAML, а не в коде.
Аналогичным образом другие аспекты процессора XAML, которые получают значения свойств в результате обработки кода XAML, также используют метод GetValue вместо оболочки. Поэтому следует также избегать любых дополнительных реализаций в определении метода get
за пределами вызова метода GetValue.
В следующем примере рекомендуется определение свойства зависимостей с оболочками, где идентификатор свойства хранится в виде public
static
readonly
поля, а get
set
определения не содержат кода за пределами необходимых методов системы свойств, которые определяют резервное копирование свойства зависимостей.
public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
"AquariumGraphic",
typeof(Uri),
typeof(AquariumObject),
new FrameworkPropertyMetadata(null,
FrameworkPropertyMetadataOptions.AffectsRender,
new PropertyChangedCallback(OnUriChanged)
)
);
public Uri AquariumGraphic
{
get { return (Uri)GetValue(AquariumGraphicProperty); }
set { SetValue(AquariumGraphicProperty, value); }
}
Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty = DependencyProperty.Register("AquariumGraphic", GetType(Uri), GetType(AquariumObject), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.AffectsRender, New PropertyChangedCallback(AddressOf OnUriChanged)))
Public Property AquariumGraphic() As Uri
Get
Return CType(GetValue(AquariumGraphicProperty), Uri)
End Get
Set(ByVal value As Uri)
SetValue(AquariumGraphicProperty, value)
End Set
End Property
См. также
.NET Desktop feedback