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
- Наследование
- Производный
- Атрибуты
Примеры
В этом примере определяется класс, производный от 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. Ниже приведены некоторые из известных производных классов:
- 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, TriggerAction, TriggerBase.
Конструкторы
| Имя | Описание |
|---|---|
| DependencyObject() |
Предоставляет поведение инициализации базового класса для производных классов DependencyObject . |
Свойства
| Имя | Описание |
|---|---|
| Dispatcher |
Всегда возвращается |
| DispatcherQueue |
Возвращает, |
Методы
| Имя | Описание |
|---|---|
| ClearValue(DependencyProperty) |
Очищает локальное значение свойства зависимостей. |
| GetAnimationBaseValue(DependencyProperty) |
Возвращает любое базовое значение, установленное для свойства зависимостей, которое будет применяться в случаях, когда анимация не активна. |
| GetValue(DependencyProperty) |
Возвращает текущее эффективное значение свойства зависимостей из DependencyObject. |
| ReadLocalValue(DependencyProperty) |
Возвращает локальное значение свойства зависимостей, если задано локальное значение. |
| RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback) |
Регистрирует функцию уведомлений для прослушивания изменений в определенном экземпляре DependencyProperty в этом экземпляре DependencyObject . |
| SetValue(DependencyProperty, Object) |
Задает локальное значение свойства зависимостей в DependencyObject. |
| UnregisterPropertyChangedCallback(DependencyProperty, Int64) |
Отменяет уведомление об изменении, которое ранее было зарегистрировано путем вызова RegisterPropertyChangedCallback. |