DependencyObject Класс

Определение

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

public ref class DependencyObject
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 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(Windows.Foundation.UniversalApiContract), 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
Производный
Атрибуты

Требования к Windows

Семейство устройств
Windows 10 (появилось в 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (появилось в v1.0)

Примеры

В этом примере определяется класс, производный от 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 Class AquariumServices
    Inherits DependencyObject
    Public Enum Buoyancy
        Floats
        Sinks
        Drifts
    End Enum

    Public Shared ReadOnly BuoyancyProperty As DependencyProperty = _
          DependencyProperty.RegisterAttached(
          "Buoyancy", _
          GetType(Buoyancy), _
          GetType(AquariumServices), _
          New PropertyMetadata(Buoyancy.Floats))


    Public Sub SetBuoyancy(element As DependencyObject, value As Buoyancy)
        element.SetValue(BuoyancyProperty, value)
    End Sub
    Public Function GetBuoyancy(element As DependencyObject) As Buoyancy
        GetBuoyancy = CType(element.GetValue(BuoyancyProperty), Buoyancy)
    End Function
End Class
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;
    }
}
Public Shared Function ClearSetProperty(targetObject As DependencyObject, targetDP As DependencyProperty) As Boolean
    If targetObject Is Nothing Or targetDP Is Nothing Then
        Throw New ArgumentNullException()
    End If
    Dim localValue As Object = targetObject.ReadLocalValue(targetDP)
    If localValue = DependencyProperty.UnsetValue Then
        ClearSetProperty = False
    Else
        targetObject.ClearValue(targetDP)
        ClearSetProperty = True
    End If
End Function

В этом примере показано простое объявление свойства зависимостей. Вызов 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); }
    }
}
Public Class Fish
    Inherits Control

    Public Shared ReadOnly SpeciesProperty As DependencyProperty = _
    DependencyProperty.Register(
    "Species", _
    GetType(String), _
    GetType(Fish), _
    Nothing)
    Public Property Species As String
        Get
            Species = CType(GetValue(SpeciesProperty), String)
        End Get
        Set(value As String)
            SetValue(SpeciesProperty, value)
        End Set
    End Property
End Class

Комментарии

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

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

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

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

DependencyObject и потоки

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

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

Вы не полностью блокируете использование DependencyObject из рабочего потока. Но необходимо получить объект CoreDispatcher (значение DependencyObject.Dispatcher) из DependencyObject, чтобы выполнить преднамеренное разделение между потоком пользовательского интерфейса приложения и любыми другими потоками, работающими в системе. CoreDispatcher предоставляет метод RunAsync. Вызовите RunAsync для выполнения ожидаемого кода ( IAsyncAction). Если это простой код, можно использовать лямбда-выражение, в противном случае можно реализовать как делегат (DispatchedHandler). Система определяет время выполнения кода. Так как он обеспечивает доступ между потоками, DependencyObject.Dispatcher является единственным API экземпляра DependencyObject или любого из его подклассов, к которому можно получить доступ из потока, не относящегося к пользовательскому интерфейсу, без исключения между потоками. Все остальные API DependencyObject создают исключение при попытке вызвать их из рабочего потока или любого другого потока, не относящегося к пользовательскому интерфейсу.

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

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

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

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

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

DependencyObject()

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

Свойства

Dispatcher

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

Методы

ClearValue(DependencyProperty)

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

GetAnimationBaseValue(DependencyProperty)

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

GetValue(DependencyProperty)

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

ReadLocalValue(DependencyProperty)

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

RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

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

SetValue(DependencyProperty, Object)

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

UnregisterPropertyChangedCallback(DependencyProperty, Int64)

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

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

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