Загрузка кода XAML и свойства зависимостей
Текущая реализация процессора WPF в XAML, по сути, учитывает свойство зависимостей. При загрузке двоичных файлов XAML и обработке атрибутов, которые являются свойствами зависимостей, процессор XAML WPF использует методы системы свойств для свойств зависимостей. При этом выполняется обход оболочек свойств. При реализации пользовательских свойств зависимостей, вы должны учитывать такое поведение и избегать размещения любой другой код в оболочке свойства, отличные от методов системы свойств GetValue и SetValue.
Предварительные требования
В этом разделе предполагается, что вы, как пользователь и разработчик, понимаете свойства зависимостей и ознакомились с разделами Общие сведения о свойствах зависимости и Пользовательские свойства зависимостей. Следует также прочитать разделы Общие сведения о языке XAML (WPF) и Подробное описание синтаксиса XAML.
Реализация загрузчика XAML WPF и производительность
В целях реализации требуется значительно меньше затрат для определения свойства как свойства зависимости и доступа к системе свойств SetValue метод, чтобы задать его, а не с помощью оболочки свойства и метода задания значения. Причина этого заключается в том, что процессору XAML требуется вывести всю объектную модель вспомогательного кода, основываясь только на сведениях о типе и связях между членами, которые определены структурой разметки и различными строками.
Поиск типа осуществляется посредством сочетания элементов xmlns и атрибутов сборки, однако для идентификации членов, определения членов которой можно установить в качестве атрибута, и разрешение типов, поддерживаемых значениями свойств обычно требуется расширенное отражение с помощью PropertyInfo. Так как свойства зависимостей данного типа доступны в виде таблицы хранилища с помощью системы свойств, WPF реализацию его XAML процессора использует эту таблицу и выводит, что любое данное свойство ABC может быть эффективнее задано путем вызова SetValue в содержащем DependencyObject производный тип, с помощью идентификатора свойства зависимости ABCProperty.
Последствия использования пользовательских свойств зависимостей
Так как текущая реализация процессора XAML в WPF при установке свойства полностью обходит оболочки, не следует помещать дополнительную логику в определения метода 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); }
}