Visão geral dos elementos base
Uma alta porcentagem de classes no WPF (Windows Presentation Foundation) é derivada de quatro classes que geralmente são conhecidas na documentação do SDK como classes de elemento base. Essas classes são UIElement, FrameworkElement, ContentElemente FrameworkContentElement. A classe DependencyObject também está relacionada, pois é uma classe base comum de UIElement e ContentElement
APIs de elemento base em classes WPF
Tanto UIElement quanto ContentElement são derivados de DependencyObject, através de caminhos um pouco diferentes. A segmentação neste nível trata de como o UIElement ou ContentElement é utilizado em uma interface do usuário e qual finalidade eles têm em um aplicativo. UIElement também tem Visual em sua hierarquia de classes, que é uma classe que expõe o suporte gráfico de nível inferior subjacente ao WPF (Windows Presentation Foundation). Visual fornece uma estrutura de renderização definindo regiões de tela retangular independentes. Na prática, UIElement é para elementos que darão suporte a 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, para permitir diferentes combinações de elementos. ContentElement não deriva de Visual; seu modelo é que uma ContentElement seria consumida por outra coisa, como um leitor ou visualizador que interpretaria os elementos e produziria o Visual completo para o WPF (Windows Presentation Foundation) consumir. Determinadas classes UIElement destinam-se a ser hosts de conteúdo: elas fornecem a hospedagem e a renderização para uma ou mais classes de 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 pode ser hospedado em um UIElement.
Framework-Level e Core-Level
UIElement serve como a classe base para FrameworkElemente ContentElement serve como a classe base para FrameworkContentElement. O motivo para esse próximo nível de classes é dar suporte a um nível de núcleo do WPF 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 da estrutura do WPF apresenta uma solução mais completa para as necessidades básicas do aplicativo, incluindo a implementação do gerenciador de layout para apresentação. O nível de núcleo do WPF fornece uma maneira de usar grande parte do WPF sem assumir a sobrecarga de um conjunto adicional. A distinção entre esses níveis 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 seja necessário saber mais 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 de interface do usuário.
Escolhendo de qual elemento derivar
A maneira mais prática de criar uma classe personalizada que estende o WPF é derivando de uma das classes do WPF em que você obtém o máximo possível da funcionalidade desejada por meio da hierarquia de classe existente. Esta seção lista a funcionalidade que vem com três das classes de elementos mais importantes para ajudá-lo a decidir de qual classe herdar.
Se você estiver implementando um controle, que é realmente um dos motivos mais comuns para derivar de uma classe WPF, você provavelmente deseja derivar de uma classe que é um controle prático, uma classe base de família de controle ou pelo menos da classe base Control. 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 precisar derivar de uma classe mais alta na hierarquia, as seções a seguir serão destinadas como um guia para quais características são definidas em cada classe de elemento base.
Se você criar uma classe derivada de DependencyObject, herdará a seguinte funcionalidade:
suporte GetValue e SetValue e suporte geral ao 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 derivada de 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 da animação.
Suporte básico de evento de entrada e suporte ao comando. Para obter mais informações, consulte Visão Geral de Entrada e Visão Geral de Comando.
Métodos virtuais que podem ser substituídos para fornecer informações a um sistema de layout.
Se você criar uma classe derivada de FrameworkElement, herdará a seguinte funcionalidade além da fornecida pelo UIElement:
Suporte para formatação e storyboards. Para mais informações, consulte a Visão geral dos Storyboards nos itens Style e .
Suporte para associação de dados. Para obter mais informações, consulte Visão geral da vinculação de dados.
Suporte para referências de recursos dinâmicos. Para obter mais informações, consulte os 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 do framework, como associação de dados, estilos ou implementação de layout do framework. Para obter mais informações, consulte Metadados de Propriedade do Framework .
O conceito da árvore lógica. Para obter mais informações, consulte Trees no WPF.
Suporte para a implementação prática no nível de framework do WPF do sistema de layout, incluindo um “OnPropertyChanged override” que pode detectar alterações nas propriedades que influenciam o layout.
Se você criar uma classe derivada de ContentElement, herdará 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 de evento de entrada e suporte ao comando. Para obter mais informações, consulte Visão Geral de Entrada e Visão Geral do Comando.
Se você criar uma classe derivada de FrameworkContentElement, você obterá a seguinte funcionalidade além da fornecida pelo ContentElement:
Suporte para estilos e storyboards. Para obter mais informações, consulte Style e visão geral da animação.
Suporte para associação de dados. Para obter mais informações, consulte Visão geral da vinculação de dados.
Suporte para referências de recursos dinâmicos. 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 associação de dados, estilos ou a implementação de layout da estrutura. 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 substituição de OnPropertyChanged que pode detectar alterações nas propriedades que influenciam o layout e reportá-las a quaisquer hosts de conteúdo.
Os modelos de conteúdo são documentados para uma variedade de classes. O modelo de conteúdo de uma classe é um fator possível que você deve considerar se quiser encontrar uma classe apropriada para derivar. Para obter mais informações, consulte do Modelo de Conteúdo do WPF.
Outras classes base
DispatcherObject
DispatcherObject fornece suporte para o modelo de threading do WPF e permite que todos os objetos criados para aplicativos WPF sejam associados a um Dispatcher. Mesmo que você não derive de UIElement, DependencyObjectou Visual, deve considerar derivar de DispatcherObject para obter suporte a esse modelo de execução em threads. Para obter mais informações, consulte Modelo de Threads.
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 Visual ocorre em outras classes (não é independente), mas a classe Visual fornece um tipo conhecido que é usado pela renderização de processos em vários níveis. Visual implementa teste de colisão, mas não expõe eventos que relatam acertos no teste de colisão (eles estão em UIElement). Para obter mais informações, consulte de 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 motivos de desempenho. O tipo Freezable fornece uma base comum para determinados 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 Visão geral dos objetos congeláveis.
Animatable é uma classe derivada Freezable que adiciona especificamente a camada de controle de animação e alguns membros utilitários, para que as propriedades animadas no momento possam ser distinguidas das propriedades não animadas.
Controle
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 do WPF são classes que representam diretamente um controle de interface do usuário ou participam de perto na composição de controle. A principal funcionalidade que Control habilita é a definição de modelos de controle.
Consulte também
- Control
- Visão geral das propriedades de dependência
- Visão geral sobre a autoria de controle
- arquitetura do WPF
.NET Desktop feedback