Visão geral de elementos base

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

APIs de elemento base nas Classes do WPF

Ambos UIElement e ContentElement são derivados de , através de DependencyObjectcaminhos um pouco diferentes. A divisão nesse nível lida com como um ou ContentElement são usados em uma interface do usuário e para qual finalidade eles servem em um UIElement aplicativo. UIElement também tem Visual em sua hierarquia de classe, que é uma classe que expõe o suporte a gráficos de nível inferior subjacente ao Windows Presentation Foundation (WPF). Visual fornece uma estrutura de renderização definindo regiões de tela retangulares independentes. Na prática, é 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 retangulares, e onde o modelo de conteúdo é deliberadamente mais aberto, UIElement para permitir diferentes combinações de elementos. ContentElement não deriva de Visual; seu modelo é que um seria consumido por outra coisa, como um ContentElement leitor ou visualizador que então interpretaria os elementos e produziria o completo Visual para o Windows Presentation Foundation (WPF) consumir. Certas UIElement classes são destinadas a ser hosts de conteúdo: eles fornecem a hospedagem e renderização para uma ou mais ContentElement classes (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 UIElementarquivo .

Nível de Framework e nível de núcleo

UIElementserve como a classe base para , e ContentElement serve como a classe base para FrameworkContentElementFrameworkElement. A razão para esse próximo nível de classes é oferecer suporte a um nível de núcleo do WPF que é separado de um nível de estrutura do WPF, com essa divisão também existindo em como as APIs são divididas entre os assemblies PresentationCore e PresentationFramework. O nível da estrutura de WPF apresenta uma solução mais completa para necessidades básicas de aplicativos, incluindo a implementação do Gerenciador de layout para apresentação. O nível principal do WPF fornece uma maneira de usar grande parte do WPF sem assumir a sobrecarga do assembly adicional. A distinção entre esses níveis muito raramente importa 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 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).

Escolher 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 por meio 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 Control classe base. Para obter algumas diretrizes e exemplos práticos, consulte Visão geral da criação de controle.

Se você não estiver criando um controle e precisa derivar de uma classe que é superior na hierarquia, as seções a seguir servirão como um guia para que características são definidas em cada classe base de elemento.

Se você criar uma classe derivada do DependencyObject, herdará a seguinte funcionalidade:

  • GetValue e suporte, e SetValue suporte ao sistema de propriedade geral.

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

Se você criar uma classe derivada do UIElement, herdará 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 de animação.

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

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

Se você criar uma classe derivada do FrameworkElement, herdará a seguinte funcionalidade, além da fornecida pelo UIElement:

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

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

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

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

  • 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 OnPropertyChanged substituição que pode detectar alterações nas propriedades que influenciam o layout.

Se você criar uma classe derivada do ContentElement, herdará a seguinte funcionalidade, além da fornecida pelo DependencyObject:

Se você criar uma classe derivada do FrameworkContentElement, obterá a seguinte funcionalidade, além da fornecida pelo ContentElement:

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

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

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

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

  • 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 no FrameworkElement. No entanto, você herda uma OnPropertyChanged substituição que pode detectar alterações nas propriedades que influenciam o layout e relatá-las a qualquer host de conteúdo.

Modelos de conteúdo estão documentados para uma variedade de classes. O modelo de conteúdo de uma classe é um fator que você deve considerar se você deseja localizar uma classe adequada para derivar dela. Para obter mais informações, consulte Modelo de conteúdo do WPF.

Outras classes 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 Dispatcherarquivo . Mesmo que você não derive de , ou Visual, DependencyObjectvocê deve considerar derivar de UIElementpara obter suporte a esse modelo de DispatcherObject threading. Para obter mais informações, consulte Modelo de Threading.

Visual

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 acontece em outras classes (não é autossuficiente), mas a Visual classe fornece um Visual tipo conhecido que é usado por processos de renderização em vários níveis. Visual implementa testes de acertos, mas não expõe eventos que relatam positivos de teste de acerto (estes estão em UIElement). Para obter mais informações, consulte Programação de Camada Visual.

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 razões de desempenho. O Freezable tipo fornece uma base comum para certos elementos gráficos, como geometrias e pincéis, bem como animações. Notavelmente, a Freezable não é um ; ele pode conter propriedades que se tornam subpropriedades quando o é aplicado para preencher um Visualvalor de propriedade de outro objeto, e essas subpropriedades podem afetar a Freezable renderização. Para obter mais informações, consulte a Visão geral de objetos congeláveis.

Animatable

Animatable é uma Freezable classe derivada 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.

Control

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 de perto na composição do controle. A principal funcionalidade que Control habilita é a modelagem de controle.

Confira também