Partilhar via


Visão geral dos elementos básicos

Uma alta porcentagem de classes no Windows Presentation Foundation (WPF) são derivadas de quatro classes que são comumente referidas na documentação do SDK como as classes de elemento base. Essas classes são UIElement, FrameworkElement, ContentElemente FrameworkContentElement. A classe DependencyObject também está relacionada, porque é uma classe base comum de UIElement e ContentElement

APIs de elemento base em classes WPF

Tanto UIElement como ContentElement derivam de DependencyObject, através de caminhos um pouco diferentes. A divisão neste nível lida com a forma como um UIElement ou ContentElement são utilizados numa interface de utilizador e para que servem numa aplicação. UIElement também tem Visual em sua hierarquia de classe, que é uma classe que expõe o suporte gráfico de nível inferior subjacente ao Windows Presentation Foundation (WPF). Visual fornece uma estrutura de renderização definindo regiões de tela retangular independentes. Na prática, UIElement é para elementos que suportarão um modelo de objeto maior, destinam-se a renderizar e layout em regiões que podem ser descritas como regiões de tela retangular e onde o modelo de conteúdo é deliberadamente mais aberto, para permitir diferentes combinações de elementos. ContentElement não deriva de Visual; o seu modelo é que um ContentElement seria consumido por outra coisa, como um leitor ou visualizador que então interpretaria os elementos e produziria o Visual completo para o Windows Presentation Foundation (WPF) consumir. Certas classes UIElement destinam-se a ser hosts de conteúdo: eles fornecem a hospedagem e renderização para uma ou mais classes ContentElement (DocumentViewer é um exemplo de tal classe). ContentElement é usado como classe base para elementos com modelos de objeto um pouco menores e que abordam mais o texto, as informações ou o conteúdo do documento que podem ser hospedados em um UIElement.

Framework-Level e Core-Level

UIElement serve como a classe base para FrameworkElemente ContentElement serve como a classe base para FrameworkContentElement. A razão para esse próximo nível de classes é oferecer suporte a um nível principal do WPF que é separado de um nível de estrutura do WPF, com essa divisão também existente em como as APIs são divididas entre os assemblies PresentationCore e PresentationFramework. O nível de estrutura do WPF apresenta uma solução mais completa para as necessidades básicas da aplicação, incluindo a implementação do gerenciador de layout para apresentação. O núcleo do WPF fornece uma maneira de usar grande parte do WPF sem a sobrecarga do conjunto adicional. A distinção entre esses níveis raramente é importante para a maioria dos cenários típicos de desenvolvimento de aplicativos e, em geral, você deve pensar nas APIs do WPF como um todo e não se preocupar com a diferença entre o nível de estrutura do WPF e o nível principal do WPF. Talvez você precise saber sobre as distinções de nível se o design do aplicativo optar por substituir quantidades substanciais de funcionalidade de nível de estrutura do WPF, por exemplo, se sua solução geral já tiver suas próprias implementações de composição e layout da interface do usuário (UI).

Escolhendo de qual elemento derivar

A maneira mais prática de criar uma classe personalizada que estende o WPF é derivando de uma das classes WPF onde você obtém o máximo possível da funcionalidade desejada através da hierarquia de classes existente. Esta seção lista a funcionalidade que vem com três das classes de elemento mais importantes para ajudá-lo a decidir de qual classe herdar.

Se você estiver implementando um controle, que é realmente uma das razões mais comuns para derivar de uma classe WPF, você provavelmente deseja derivar de uma classe que é um controle prático, uma classe base da família de controle ou, pelo menos, da classe base Control. Para obter algumas orientações e exemplos práticos, consulte Visão geral da criação de controle.

Se você não estiver criando um controle e precisar derivar de uma classe que é mais alta na hierarquia, as seções a seguir destinam-se a ser um guia para quais características são definidas em cada classe de elemento base.

Se você criar uma classe que deriva de DependencyObject, você herda a seguinte funcionalidade:

  • Suporte para GetValue e SetValue, e suporte geral para o sistema de propriedades.

  • Capacidade de usar propriedades de dependência e propriedades anexadas que são implementadas como propriedades de dependência.

Se você criar uma classe que deriva de UIElement, você herda a seguinte funcionalidade, além da fornecida pelo DependencyObject:

  • Suporte básico para valores de propriedade animados. Para obter mais informações, consulte Visão geral da animação .

  • Suporte básico a eventos de entrada e suporte a comandos. Para obter mais informações, consulte Visão geral da entrada e Visão geral do comando.

  • Métodos virtuais que podem ser substituídos para fornecer informações a um sistema de layout.

Se você criar uma classe que deriva de FrameworkElement, você herda a seguinte funcionalidade, além da fornecida pelo UIElement:

  • Suporte para estilos e storyboards. Para obter mais informações, consulte a Visão Geral dos Storyboards Style e .

  • Suporte para vinculação de dados. Para obter mais informações, consulte Visão geral da vinculação de dados .

  • Suporte para referências dinâmicas de recursos. Para obter mais informações, consulte Recursos XAML.

  • Suporte à herança de valor de propriedade e outros sinalizadores nos metadados que ajudam a relatar condições sobre propriedades aos serviços da estrutura, como vinculação de dados, estilos ou a implementação do layout da estrutura. Para obter mais informações, consulte Framework Property Metadata.

  • O conceito de árvore lógica. Para obter mais informações, consulte Árvores no WPF.

  • Suporte para a implementação prática em nível de estrutura WPF do sistema de layout, incluindo uma substituição de OnPropertyChanged que pode detetar alterações nas propriedades que influenciam o layout.

Se você criar uma classe que deriva de ContentElement, você herda a seguinte funcionalidade, além da fornecida pelo DependencyObject:

  • Suporte para animações. Para obter mais informações, consulte Visão geral da animação .

  • Suporte básico a eventos de entrada e suporte a comandos. Para obter mais informações, consulte Visão geral da entrada e Visão geral do comando.

Se você criar uma classe que deriva de FrameworkContentElement, você obtém a seguinte funcionalidade, além da fornecida por ContentElement:

  • Suporte para estilos e storyboards. Para obter mais informações, consulte Style e Visão geral da animação.

  • Suporte para vinculação de dados. Para obter mais informações, consulte Visão geral da vinculação de dados .

  • Suporte para referências dinâmicas de recursos. Para obter mais informações, consulte Recursos XAML.

  • Suporte à herança de valor de propriedade e outros sinalizadores nos metadados que ajudam a relatar condições sobre propriedades para serviços de estrutura, como vinculação de dados, estilos ou a implementação de layout da estrutura. Para obter mais informações, consulte Framework Property Metadata.

  • Você não herda o acesso a modificações do sistema de layout (como ArrangeOverride). As implementações do sistema de layout só estão disponíveis em FrameworkElement. No entanto, você herda uma substituição de OnPropertyChanged que pode detetar alterações nas propriedades que influenciam o layout e relatá-las a qualquer host de conteúdo.

Os modelos de conteúdo são documentados para uma variedade de classes. O modelo de conteúdo para uma classe é um fator possível que você deve considerar se quiser encontrar uma classe apropriada para derivar. Para obter mais informações, consulte WPF Content Model.

Outras classes de base

DispatcherObject

DispatcherObject fornece suporte para o modelo de threading WPF e permite que todos os objetos criados para aplicativos WPF sejam associados a um Dispatcher. Mesmo que não derives de UIElement, DependencyObjectou Visual, deves considerar derivar de DispatcherObject para obter suporte a este modelo de encadeamento. Para obter mais informações, consulte Threading Model.

Visuais

Visual implementa o conceito de um objeto 2D que geralmente requer apresentação visual em uma região aproximadamente retangular. A renderização real de um Visual acontece em outras classes (não é independente), mas a classe Visual fornece um tipo conhecido que é usado por processos de renderização em vários níveis. Visual implementa testes de deteção de colisão, mas não expõe eventos que relatam resultados positivos de testes de deteção (estes estão em UIElement). Para obter mais informações, consulte Visual Layer Programming.

Congelável

Freezable simula a imutabilidade em um objeto mutável, fornecendo os meios para gerar cópias do objeto quando um objeto imutável é necessário ou desejado por motivos de desempenho. O tipo Freezable fornece uma base comum para certos elementos gráficos, como geometrias e pincéis, bem como animações. Notavelmente, um Freezable não é um Visual; Ele pode conter propriedades que se tornam subpropriedades quando o Freezable é aplicado para preencher um valor de propriedade de outro objeto, e essas subpropriedades podem afetar a renderização. Para obter mais informações, consulte a visão geral de Objetos Congeláveis .

Animatable

Animatable é uma classe derivada de Freezable que adiciona especificamente a camada de controle de animação e alguns membros do utilitário para que as propriedades animadas atualmente possam ser distinguidas das propriedades não animadas.

Controlo

Control é a classe base pretendida para o tipo de objeto que é chamado de controle ou componente, dependendo da tecnologia. Em geral, as classes de controle WPF são classes que representam diretamente um controle de interface do usuário ou participam estreitamente na composição do controle. A principal funcionalidade que Control habilita é a modelagem de controle.

Ver também