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).
  • Принудительное применение сходства потоков с потоком пользовательского интерфейса main среда выполнения Windows для всех DependencyObject экземпляров.
  • Свойство DispatcherQueue для расширенных сценариев потоков. Позволяет DispatcherQueue рабочему потоку выполнять код, который использует DependencyObject , но не находится в потоке пользовательского интерфейса, так как он может отложить выполнение до асинхронной операции, которая не будет блокировать поток пользовательского интерфейса или иным образом мешать ему. См. раздел "DependencyObject и потоки" ниже.
  • Поддержка базовой привязки данных и стиля путем включения свойств в качестве выражений, которые будут вычисляться позже в течение времени существования объекта. Эти понятия более подробно описаны в статье Общие сведения о свойствах зависимостей. Дополнительные сведения см . в разделе Привязка данных.

DependencyObject и потоки

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

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

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

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

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

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

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

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

DependencyObject()

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

Свойства

Dispatcher

Всегда возвращается null в приложении Windows App SDK. Вместо этого используйте 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.

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

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