DependencyObject Класс

Определение

Представляет объект, участвующий в системе свойств зависимостей.

public ref class DependencyObject
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class DependencyObject
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.UI.Xaml.WinUIContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public class DependencyObject
Public Class DependencyObject
Наследование
Object Platform::Object IInspectable DependencyObject
Производный
Атрибуты

Примеры

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

public abstract class AquariumServices : DependencyObject
{
    public enum Buoyancy { Floats, Sinks, Drifts }

    public static readonly DependencyProperty BuoyancyProperty = DependencyProperty.RegisterAttached(
      "Buoyancy",
      typeof(Buoyancy),
      typeof(AquariumServices),
      new PropertyMetadata(Buoyancy.Floats)
    );
    public static void SetBuoyancy(DependencyObject element, Buoyancy value)
    {
        element.SetValue(BuoyancyProperty, value);
    }
    public static Buoyancy GetBuoyancy(DependencyObject element)
    {
        return (Buoyancy)element.GetValue(BuoyancyProperty);
    }
}
public static bool ClearSetProperty(DependencyObject targetObject, DependencyProperty targetDP)
{
    if (targetObject == null || targetDP == null)
    {
        throw new ArgumentNullException();
    }
    object localValue = targetObject.ReadLocalValue(targetDP);
    if (localValue == DependencyProperty.UnsetValue)
    {
        return false;
    }
    else
    {
        targetObject.ClearValue(targetDP);
        return true;
    }
}

В этом примере показано простое объявление свойства зависимостей. Вызов GetValue представляет собой всю get реализацию метода доступа для оболочки свойства нового свойства зависимостей. Вызов SetValue представляет собой всю set реализацию метода доступа. Дополнительные примеры см. в разделе "Настраиваемые свойства зависимостей".

public class Fish : Control
{
    public static readonly DependencyProperty SpeciesProperty =
    DependencyProperty.Register(
    "Species",
    typeof(String),
    typeof(Fish), null
    );
    public string Species
    {
        get { return (string)GetValue(SpeciesProperty); }
        set { SetValue(SpeciesProperty, (string)value); }
    }
}

Комментарии

Класс DependencyObject включает службы системы свойств зависимостей для многих производных классов и является непосредственным базовым классом многих важных классов, связанных с пользовательским интерфейсом, таких как UIElement, Geometry, FrameworkTemplate, Style и ResourceDictionary. Дополнительные сведения о том, как DependencyObject поддерживают свойства зависимостей, см. в обзоре свойств зависимостей.

Основная функция системы свойств зависимостей — вычислить значения свойств и предоставить системное уведомление о измененных значениях. Другим ключевым классом, участвующим в системе свойств зависимостей, является DependencyProperty. DependencyProperty позволяет регистрировать свойства зависимостей в системе свойств, тогда как DependencyObject базовый класс позволяет объектам использовать и задавать свойства зависимостей.

Ниже приведены некоторые важные службы и характеристики, которые предоставляет или поддерживает DependencyObject:

  • Поддержка размещения свойств зависимостей для существующих свойств зависимостей среда выполнения Windows.
  • Поддержка размещения настраиваемых свойств зависимостей. Вы регистрируете свойство зависимостей, вызывая метод Register и сохраняя возвращаемое значение метода в качестве общедоступного статического свойства в DependencyObject классе.
  • Поддержка размещения присоединенного свойства для существующих среда выполнения Windows присоединенных свойств.
  • Поддержка размещения настраиваемых присоединенных свойств. Вы регистрируете свойство зависимостей для использования присоединенного свойства, вызывая метод RegisterAttached и сохраняя возвращаемое значение метода в качестве общедоступного статического свойства в классе.
  • Getи Set служебные методы для значений любых свойств зависимостей, существующих в .DependencyObject Они используются при определении пользовательских оболочк свойств зависимостей и также могут использовать их из кода приложения в качестве альтернативы использованию существующих свойств оболочки .
  • Программа расширенного сценария для проверки метаданных или значений свойств (например , GetAnimationBaseValue).
  • Принудительное применение сопоставления потоков с основным потоком пользовательского интерфейса среда выполнения Windows для всех DependencyObject экземпляров.
  • Свойство DispatcherQueue для расширенных сценариев потоков. Позволяет DispatcherQueue рабочему потоку выполнять код, который использует DependencyObject не в потоке пользовательского интерфейса, так как он может отложить выполнение в асинхронную операцию, которая не будет блокировать или иначе вмешиваться в поток пользовательского интерфейса. См. раздел "DependencyObject и потоки" ниже.
  • Базовая поддержка привязки данных и стилизации путем включения свойств в качестве выражений, которые будут оцениваться в некоторых последующих точках существования объекта. Эти понятия подробно описаны в обзоре свойств зависимостей. Дополнительные сведения см. в разделе "Привязка данных".

DependencyObject и потоки

Все DependencyObject экземпляры должны создаваться в потоке пользовательского интерфейса, связанном с текущим окном для приложения. Это применяется системой и имеет два важных последствия для кода:

  • Код, использующий API из двух экземпляров, всегда будет выполняться в одном DependencyObject потоке, который всегда является потоком пользовательского интерфейса. В этом сценарии обычно не возникают проблемы с потоком.
  • Код, который не выполняется в основном потоке пользовательского интерфейса, не может получить доступ напрямую DependencyObject , так как DependencyObject имеет сходство потоков только с потоком пользовательского интерфейса. Только код, выполняющийся в потоке пользовательского интерфейса, может изменять или даже считывать значение свойства зависимости. Например, рабочий поток, инициированный задачей .NET или явным потоком ThreadPool, не сможет считывать свойства зависимостей или вызывать другие API.

Вы не полностью блокируете использование DependencyObject рабочего потока. Но необходимо получить объект DispatcherQueue (значение DependencyObject.DispatcherQueue), DependencyObject чтобы выполнить преднамеренное разделение между потоком пользовательского интерфейса приложения и любыми другими потоками, работающими в системе. Предоставляет DispatcherQueue метод TryEnqueue для запуска ожидаемого кода. Так как он включает доступ между потоками, DependencyObject.DispatcherQueue это единственный API экземпляра DependencyObject или любой из его подклассов, к которым можно получить доступ из потока, отличного от пользовательского интерфейса, без исключения между потоками. Все остальные DependencyObject API вызывают исключение, если вы пытаетесь вызвать их из рабочего потока или любого другого потока, отличного от пользовательского интерфейса.

Проблемы с потоком обычно можно избежать в типичном коде пользовательского интерфейса. Однако устройства обычно не связаны с потоком пользовательского интерфейса. Если вы используете сведения, полученные с устройства для обновления пользовательского интерфейса в режиме реального времени, часто необходимо получить так DispatcherQueue , чтобы можно было обновить пользовательский интерфейс. Службы являются еще одним случаем, когда код, используемый для доступа к службе, может не выполняться в потоке пользовательского интерфейса.

Один сценарий кода, в котором могут возникнуть проблемы с потоком, связанные с DependencyObjectпотоком, если вы определяете собственные DependencyObject типы и пытаетесь использовать их для источников данных или других сценариев, где DependencyObject не обязательно подходящий объект (так как объект не связан напрямую с пользовательским интерфейсом). Например, вы можете попытаться оптимизировать perf с фоновыми потоками или другими рабочими потоками, которые изменяют значения объектов до презентации или в ответ на устройство, службу или другие внешние входные данные. Оцените, требуются ли свойства зависимостей для вашего сценария; Может быть, стандартные свойства являются адекватными.

Производные классы DependencyObject

DependencyObject — родительский класс для нескольких сразу производных классов, которые являются основными для модели программирования, используемой для приложения и его пользовательского интерфейса XAML. Ниже приведены некоторые из известных производных классов:

Конструкторы

Имя Описание
DependencyObject()

Предоставляет поведение инициализации базового класса для производных классов DependencyObject .

Свойства

Имя Описание
Dispatcher

Всегда возвращается null в приложении пакета SDK для приложений windows. Вместо этого используйте DispatcherQueue .

DispatcherQueue

Возвращает, DispatcherQueue с которым связан этот объект. Представляет DispatcherQueue собой объект, который может получить доступ к DependencyObject потоку пользовательского интерфейса, даже если код инициируется потоком, отличным от пользовательского интерфейса.

Методы

Имя Описание
ClearValue(DependencyProperty)

Очищает локальное значение свойства зависимостей.

GetAnimationBaseValue(DependencyProperty)

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

GetValue(DependencyProperty)

Возвращает текущее эффективное значение свойства зависимостей из DependencyObject.

ReadLocalValue(DependencyProperty)

Возвращает локальное значение свойства зависимостей, если задано локальное значение.

RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

Регистрирует функцию уведомлений для прослушивания изменений в определенном экземпляре DependencyProperty в этом экземпляре DependencyObject .

SetValue(DependencyProperty, Object)

Задает локальное значение свойства зависимостей в DependencyObject.

UnregisterPropertyChangedCallback(DependencyProperty, Int64)

Отменяет уведомление об изменении, которое ранее было зарегистрировано путем вызова RegisterPropertyChangedCallback.

Применяется к

См. также раздел