Поделиться через


Общие сведения о базовых элементах

Высокий процент классов в Windows Presentation Foundation (WPF) является производным от четырех классов, которые обычно называются в документации по пакету SDK в качестве базовых классов элементов. Эти классы: UIElement, FrameworkElementContentElementи FrameworkContentElement. Класс DependencyObject также связан, так как это общий базовый класс обоих UIElement и ContentElement

API базовых элементов в классах WPF

Оба UIElement и ContentElement являются производными от DependencyObject, через несколько разных путей. Разделение на этом уровне связано с тем, как UIElement или ContentElement используются в пользовательском интерфейсе и какой цели они служат в приложении. UIElement также имеет Visual в своей иерархии классов, который является классом, который предоставляет более низкий уровень графической поддержки, лежащей в основе Windows Presentation Foundation (WPF). Visual предоставляет платформу отрисовки, определяя независимые прямоугольные области экрана. На практике UIElement предназначены для элементов, которые поддерживают более крупную объектную модель, и призваны выполнять отрисовку и размещение в области, которые можно описать как прямоугольные области экрана, и где модель содержания намеренно более открыта, чтобы позволить разные комбинации элементов. ContentElement не является производным от Visual; его модель предполагает, что ContentElement будет потребляться чем-то другим, например, читателем или средством просмотра, которые затем интерпретируют элементы и создают полный Visual для использования Windows Presentation Foundation (WPF). Некоторые UIElement классы предназначены для размещения контента: они предоставляют хостинг и отрисовку для одного или нескольких ContentElement классов (DocumentViewer пример такого класса). ContentElement используется в качестве базового класса для элементов с несколько меньшими объектными моделями и лучше подходит для работы с текстом, информацией или содержимым документа, которое может быть размещено в пределах UIElement.

Framework-Level и Core-Level

UIElement служит базовым классом для FrameworkElement, и ContentElement служит базовым классом для FrameworkContentElement. Цель следующего уровня классов заключается в поддержке базового уровня WPF, который отделен от уровня фреймворка WPF; это разделение также видно в том, как API разделяются между сборками PresentationCore и PresentationFramework. Уровень платформы WPF представляет более полное решение для основных потребностей приложения, включая реализацию диспетчера макетов для презентации. Базовый уровень WPF позволяет использовать большую часть WPF без дополнительных затрат на сборку. Различие между этими уровнями очень редко имеет значение для большинства типичных сценариев разработки приложений, и в целом следует рассматривать API WPF в целом и не беспокоиться о разнице между уровнем платформы WPF и уровнем ядра WPF. Возможно, вам потребуется знать о различиях на уровне, если проект приложения решит заменить значительные объемы функциональных возможностей уровня платформы WPF, например, если общее решение уже имеет собственные реализации композиции и макета пользовательского интерфейса.

Выбор элемента, наследуемого от

Наиболее практическим способом создания пользовательского класса, расширяющего WPF, является производный от одного из классов WPF, где вы получаете максимально возможное количество требуемых функций через существующую иерархию классов. В этом разделе перечислены функциональные возможности, связанные с тремя из самых важных классов элементов, чтобы помочь вам решить, от какого класса наследоваться.

Если вы реализуете элемент управления, который действительно является одной из наиболее распространенных причин для производных от класса WPF, вы, вероятно, хотите наследоваться от класса, который является практическим элементом управления, базовым классом семейства элементов управления или по крайней мере из Control базового класса. Некоторые рекомендации и практические примеры см. в разделе "Обзор разработки элементов управления".

Если вы не создаете контрол и вам нужно наследовать класс на более высоком уровне в иерархии, следующие разделы предназначены как руководство, объясняющее, какие характеристики определены в каждом классе базовых элементов.

Если вы создаете класс, производный от DependencyObject, вы наследуете следующую функциональность:

  • GetValue поддержка и SetValue общая поддержка системы свойств.

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

Если вы создаете класс, производный от UIElement, вы наследуете следующие функциональные возможности в дополнение к следующим возможностям, предоставляемым DependencyObject:

  • Базовая поддержка анимированных значений свойств. Для получения дополнительной информации смотрите раздел Обзор анимации.

  • Базовая поддержка событий ввода и поддержка команд. Дополнительные сведения см. в разделе "Обзор входных данных " и "Обзор команд".

  • Виртуальные методы, которые можно переопределить, чтобы предоставить информацию системе макета.

Если вы создаете класс, производный от FrameworkElement, вы наследуете следующие функциональные возможности в дополнение к следующим возможностям, предоставляемым UIElement:

  • Поддержка стилей и раскадровок. Дополнительные сведения см. в разделе Style "Обзор раскадровки".

  • Поддержка привязки данных. Дополнительные сведения см. в обзоре привязки данных .

  • Поддержка динамических ссылок на ресурсы. Дополнительные сведения см. в ресурсах XAML и.

  • Поддержка наследования значений свойств и другие флаги в метаданных, которые помогают сообщать условия о свойствах для служб платформы, таких как привязка данных, стили или реализация макета платформы. Дополнительные сведения см. в разделе Метаданные свойств Framework.

  • Концепция логического дерева. Дополнительные сведения см. в разделе "Деревья" в WPF.

  • Поддержка практической реализации платформы WPF системы макета, включая OnPropertyChanged переопределение, которое может обнаруживать изменения свойств, влияющих на макет.

Если вы создаете класс, производный от ContentElement, вы наследуете следующие функциональные возможности в дополнение к следующим возможностям, предоставляемым DependencyObject:

При создании класса, наследуемого от FrameworkContentElement, вы получаете следующие функции в дополнение к следующим возможностям, предоставляемым ContentElement:

  • Поддержка стилей и раскадровок. Дополнительные сведения см. в разделе Style " Обзор анимации".

  • Поддержка привязки данных. Дополнительные сведения см. в обзоре привязки данных .

  • Поддержка динамических ссылок на ресурсы. Дополнительные сведения см. в ресурсах XAML и.

  • Поддержка наследования значений свойств и другие флаги в метаданных, которые помогают сообщать условия о свойствах для служб платформы, таких как привязка данных, стили или реализация макета платформы. Дополнительные сведения см. в разделе Метаданные свойств Framework.

  • Доступ к изменениям системы макета (например ArrangeOverride, не наследуется). Реализации системы макета доступны только в FrameworkElement. Однако вы наследуете OnPropertyChanged переопределение, которое может обнаруживать изменения свойств, влияющих на макет, и сообщать об этом любому хосту содержимого.

Модели содержимого документируются для различных классов. Модель содержимого для класса является одним из возможных факторов, которые следует учитывать, если требуется найти соответствующий класс, производный от. Дополнительные сведения см. в разделе Модель содержимого WPF.

Другие базовые классы

DispatcherObject

DispatcherObject обеспечивает поддержку модели потоков WPF и позволяет ассоциировать все объекты, созданные для приложений WPF, с Dispatcher. Даже если вы не наследуете от UIElement, DependencyObject, или Visual, вам следует рассмотреть возможность наследования от DispatcherObject для получения поддержки этой модели потоков. Дополнительные сведения см. в разделе "Модель потоков".

Визуальный элемент

Visual реализует концепцию 2D-объекта, который обычно требует визуальной презентации в примерно прямоугольной области. Фактическая отрисовка Visual происходит в других классах (она не является автономной), но Visual класс предоставляет известный тип, используемый процессами отрисовки на различных уровнях. Visual реализует тестирование попаданий, но оно не предоставляет события, сообщающие о положительных результатах тестирования попаданий (они находятся в UIElement). Дополнительные сведения см. в разделе "Программирование визуального слоя".

замораживаемый

Freezable имитирует неизменяемость в изменяемом объекте, предоставляя средства для создания копий объекта, когда неизменяемый объект требуется или требуется по соображениям производительности. Тип Freezable предоставляет общую основу для некоторых графических элементов, таких как геометрии и кисти, а также анимации. В частности, Freezable не является Visual; он может содержать свойства, которые становятся вложенными, когда Freezable применяется для заполнения значения свойства другого объекта, и эти вложенные свойства могут повлиять на отрисовку. Для получения дополнительной информации см. Обзор замораживаемых объектов.

Animatable

Animatable — производный Freezable класс, который специально добавляет слой управления анимацией и некоторые элементы служебной программы, чтобы в настоящее время анимированные свойства можно отличить от неанимированных свойств.

Контроль

Control — это предназначенный базовый класс для типа объекта, который называется элементом управления или компонентом в зависимости от технологии. Как правило, классы элементов управления WPF — это классы, которые напрямую представляют элемент управления пользовательского интерфейса или тесно участвуют в композиции элементов управления. Основная функциональность, которую обеспечивает Control, заключается в создании шаблонов управления.

См. также