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
- Наследование
- Производный
- Атрибуты
Требования к 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. Ниже приведены некоторые важные производные классы:
- UIElement: базовый класс для большинства визуальных объектов, которые могут обрабатывать входные данные в пользовательском интерфейсе. FrameworkElement находится далее в этой иерархии, как и Control, поэтому в среда выполнения Windows есть сотни элементов управления и других классов, которые имеют класс UIElement в иерархиях классов.
- Системные классы поддержки стилей XAML: FrameworkTemplate (родительский элемент ControlTemplate, DataTemplate, ItemsPanelTemplate), Style, SetterBase (родительский элемент Setter), ToolTipTemplateSettings и другие *TemplateSettings.
- Модель визуального состояния: Transition, VisualState, VisualStateGroup, VisualStateManager, VisualTransition.
- Поддержка привязки данных: BindingBase (родитель привязки), CollectionViewSource, PropertyPath, RelativeSource.
- Раскадровка анимации: временная шкала (родитель раскадровки, типизированные анимации, анимации тем), типизированные ключевые кадры (например , ColorKeyFrame), KeySpline, EasingFunctionBase.
- Графические и отрисовочные примитивы XAML: Brush, Geometry, GeneralTransform, GradientStop, PathFigure, PathSegment, Проекция.
- Взаимодействие с поверхностью визуализации и отрисовки: ImageSource (родительский объект BitmapSource, RenderTargetBitmap, SurfaceImageSource и другие).
- Окно: представляет окно приложения main.
- FlyoutBase (родительский элемент Flyout и MenuFlyout).
- ResourceDictionary: определяет ключевые ресурсы в XAML.
- TextElement: родительский объект Block и Inline. Они, в свою очередь, являются базовыми классами для текстовых элементов, используемых для содержимого TextBlock или элементов форматированного текста.
- AutomationPeer: базовый класс для одноранговых элементов автоматизации пользовательского интерфейса Майкрософт, представляющих элементы управления XAML для прослушивателя службы автоматизации пользовательского интерфейса Майкрософт. Кроме того, IRawElementProviderSimple.
- Прочее: CacheMode, ColumnDefinition, DependencyObjectCollection, InputScope, InputScopeName, PageStackEntry, PrintDocument, RowDefinition, TimelineMarker, TriggerAction, TriggerBase.
Конструкторы
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. |