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

Большое количество классов в Windows Presentation Foundation являются производными от четырех классов, которые обычно называются в документации по SDK базовыми классами элементов. Этими классами являются UIElement, FrameworkElement, ContentElement и 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.

Уровень платформы и уровень ядра

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

Выбор элемента для наследования

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

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

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

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

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

  • Возможность использования свойств зависимостей и вложенных свойств, которые реализуются как свойства зависимостей.

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

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

  • Поддержка стилей и раскадровок. Подробнее см. в статье Style и Общие сведения о Storyboard.

  • Поддержка привязки данных. Более подробную информацию см. в разделе Общие сведения о связывании данных.

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

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

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

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

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

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

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

  • Поддержка привязки данных. Более подробную информацию см. в разделе Общие сведения о связывании данных.

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

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

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

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

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

DispatcherObject

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

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

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

Freezable

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

Animatable

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

Элемент управления

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

См. также