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


Загрузка кода XAML и свойства зависимостей

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

В этом разделе содержатся следующие подразделы.

  • Предварительные требования
  • Реализация загрузчика XAML WPF и производительность
  • Последствия использования пользовательских свойств зависимостей
  • Связанные разделы

Предварительные требования

В этом разделе предполагается, что пользователь, как заказчик и автор, понимает свойства зависимостей и ознакомился с разделами Общие сведения о свойствах зависимости и Пользовательские свойства зависимостей. Следует также прочитать разделы Общие сведения о языке XAML (WPF) и Подробное описание синтаксиса XAML.

Реализация загрузчика XAML WPF и производительность

С точки зрения реализации, для определения свойства как свойства зависимости и доступа к методу SetValue системы свойств для его установки требуется значительно меньше затрат, чем для использования оболочки свойства и ее метода установки. Причина этого заключается в том, что процессору XAML требуется логически вывести всю объектную модель вспомогательного кода, основываясь только на сведениях о типе и связи между членами, которые определены структурой разметки и различными строками.

Поиск типа осуществляется посредством сочетания элементов XMLNS и атрибутов сборки, однако для идентификации членов, определения тех членов, которые можно установить в качестве атрибута, и типов, поддерживаемых значениями свойств, требуется расширенное отражение с помощью объекта PropertyInfo. Поскольку свойства зависимостей данного типа доступны в виде таблицы хранилища с помощью системы свойств, реализация приложением WPF его процессора XAML использует эту таблицу и логически выводит, что любое данное свойство ABC может быть задано более эффективно посредством вызова метода SetValue в содержащем его производном типе DependencyObject, используя идентификатор свойства зависимостей свойство_ABC.

Последствия использования пользовательских свойств зависимостей

Поскольку текущая реализация процессора XAML приложения WPF при установке свойства полностью обходит программы-оболочки, не следует помещать дополнительную логику в определения метода set программы-оболочки для пользовательского свойства зависимостей. Если поместить такую логику в определение метода set, она не будет выполняться, если свойство задается в XAML, а не в коде.

Аналогичным образом, другие аспекты процессора XAML, которые получают значения свойств в результате обработки кода XAML, также используют метод GetValue вместо программы-оболочки. Поэтому следует также избегать любых дополнительных реализаций в определении метода get за пределами вызова метода GetValue.

В следующем примере показано рекомендуемое определение свойства зависимости с оболочками, где идентификатор свойства хранится в виде поля с атрибутами public static readonly, а определения методов get и set не содержат кода за пределами необходимых методов системы свойств, определяющих резервное свойство зависимости.


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

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); }
}

См. также

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

Общие сведения о свойствах зависимости

Общие сведения о языке XAML (WPF)

Метаданные свойства зависимости

Свойства зависимостей типа коллекция

Безопасность свойства зависимости

Шаблоны безопасного конструктора для DependencyObjects