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 представляет собой всю реализацию метода доступа для оболочки свойства нового свойства. Вызов SetValue представляет собой всю реализацию набора доступа. Дополнительные примеры см. в разделе "Настраиваемые свойства зависимостей".
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).
- Принудительное сопоставление потоков с основным потоком пользовательского интерфейса среда выполнения Windows для всех экземпляров DependencyObject.
- Свойство Диспетчера для расширенных сценариев потоков. Получение значения диспетчера предоставляет ссылку на объект CoreDispatcher . С помощью CoreDispatcher рабочий поток может запускать код, использующее DependencyObject, но не в потоке пользовательского интерфейса, так как CoreDispatcher может отложить выполнение до асинхронной операции, которая не будет блокировать или иначе вмешиваться в поток пользовательского интерфейса. См. раздел "DependencyObject и потоки" ниже.
- Базовая поддержка привязки данных и стилизации путем включения свойств в качестве выражений, которые будут оцениваться в некоторых последующих точках существования объекта. Эти понятия подробно описаны в обзоре свойств зависимостей. Дополнительные сведения см. в разделе "Привязка данных".
DependencyObject и потоки
Все экземпляры DependencyObject должны быть созданы в потоке пользовательского интерфейса, связанном с текущим окном для приложения. Это применяется системой и имеет два важных последствия для кода:
- Код, использующий API из двух экземпляров DependencyObject, всегда будет выполняться в одном потоке, который всегда является потоком пользовательского интерфейса. В этом сценарии обычно не возникают проблемы с потоком.
- Код, который не выполняется в основном потоке пользовательского интерфейса, не может получить доступ к DependencyObject напрямую, так как DependencyObject имеет сходство потоков только с потоком пользовательского интерфейса. Только код, выполняющийся в потоке пользовательского интерфейса, может изменять или даже считывать значение свойства зависимости. Например, рабочий поток, инициированный задачей .NET или явным потоком ThreadPool, не сможет считывать свойства зависимостей или вызывать другие API.
Вы не полностью блокируете использование DependencyObject из рабочего потока. Но необходимо получить объект CoreDispatcher (значение DependencyObject.Dispatcher) из DependencyObject, чтобы выполнить преднамеренное разделение между потоком пользовательского интерфейса приложения и другими потоками, работающими в системе. CoreDispatcher предоставляет метод RunAsync. Вызовите RunAsync, чтобы запустить ожидаемый код (IAsyncAction). Если это простой код, можно использовать лямбда-выражение, в противном случае можно реализовать как делегат (DispatchedHandler). Система определяет время выполнения кода. Так как он включает доступ между потоками, DependencyObject.Dispatcher является единственным API экземпляра DependencyObject или любым из его подклассов, к которым можно получить доступ из потока, отличного от пользовательского интерфейса, без исключения между потоками. Все остальные API DependencyObject вызывают исключение, если вы пытаетесь вызвать их из рабочего потока или любого другого потока, отличного от пользовательского интерфейса.
Проблемы с потоком обычно можно избежать в типичном коде пользовательского интерфейса. Однако устройства обычно не связаны с потоком пользовательского интерфейса. Если вы используете сведения, полученные с устройства для обновления пользовательского интерфейса в режиме реального времени, часто необходимо получить CoreDispatcher , чтобы можно было обновить пользовательский интерфейс. Службы являются еще одним случаем, когда код, используемый для доступа к службе, может не выполняться в потоке пользовательского интерфейса.
Один сценарий кода, в котором могут возникнуть проблемы, связанные с потоком DependencyObject, если вы определяете собственные типы DependencyObject и пытаетесь использовать их для источников данных, или другие сценарии, в которых зависимостьObject не обязательно подходит (так как объект не связан напрямую с пользовательским интерфейсом). Например, вы можете попытаться оптимизировать perf с фоновыми потоками или другими рабочими потоками, которые изменяют значения объектов до презентации или в ответ на устройство, службу или другие внешние входные данные. Оцените, требуются ли свойства зависимостей для вашего сценария; Может быть, стандартные свойства являются адекватными.
Производные классы DependencyObject
DependencyObject — это родительский класс для нескольких сразу производных классов, которые являются основными для модели программирования, используемой для приложения и его пользовательского интерфейса XAML. Ниже приведены некоторые из известных производных классов:
- UIElement: базовый класс для большинства визуальных объектов, которые могут обрабатывать входные данные в пользовательском интерфейсе. FrameworkElement находится дальше в этой иерархии, как и Control, поэтому в среда выполнения Windows есть сотни элементов управления и другие классы, которые имеют класс UIElement в их иерархиях классов.
- Классы поддержки системы стилей XAML: FrameworkTemplate (родительский элемент ControlTemplate, DataTemplate, ItemsPanelTemplate), Style, SetterBase (родительский элемент Setter), ToolTipTemplateSettings и другие *TemplateSettings.
- Модель визуального состояния: переход, VisualState, VisualStateGroup, VisualStateManager, VisualTransition.
- Поддержка привязки данных: BindingBase (родитель привязки), CollectionViewSource, PropertyPath, RelativeSource.
- Раскадровки анимаций: временная шкала (родитель раскадровки, типизированные анимации, анимации тем), типизированные ключевые кадры (например , ColorKeyFrame), KeySpline, EasingFunctionBase.
- Графические и отрисовочные примитивы XAML: Кисть, Геометрия, GeneralTransform, GradientStop, PathFigure, PathSegment, Проекция.
- Взаимодействие с изображением и отображением поверхности: ImageSource (родительский объект BitmapSource, RenderTargetBitmap, SurfaceImageSource и другие).
- Окно: представляет главное окно приложения.
- FlyoutBase (родительский элемент Всплывающего элемента и MenuFlyout).
- ResourceDictionary: определяет ключевые ресурсы в XAML.
- TextElement: родительский элемент Block и Inline, в свою очередь являются базовыми классами для текстовых элементов, используемых для содержимого TextBlock или элементов форматированного текста.
- AutomationPeer: базовый класс для одноранговых узлов Microsoft модель автоматизации пользовательского интерфейса, представляющих элементы управления XAML в прослушиватель Microsoft модель автоматизации пользовательского интерфейса. Кроме того, 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. |