Compartilhar via


Visão Geral de Adornos

Adornos são um tipo especial de FrameworkElement, usados para fornecer dicas visuais para o usuário. Dentro outros usos, Adornos podem ser usados para adicionar ganchos funcionais a elementos ou fornecer informações de estado sobre um controle.

Este tópico contém as seguintes seções.

  • Sobre Adornos
  • Implementando um Adorno Customizado
  • Comportamento de Renderização para Adornos
  • Eventos e Teste de Clique
  • Adornado um Único UIElement
  • Adornando os Filhos de um Painel
  • Tópicos relacionados

Sobre Adornos

Um Adorner é um FrameworkElement customizado que está amarrado a um UIElement. Adornos são renderizados em um AdornerLayer, que é uma superfície de renderização que sempre está acima do elemento adornado ou uma coleção de elementos adornados. Renderização de um adorno é independente da renderização do UIElement ao qual ele está amarrado. Um adorno é tipicamente posicionado relativamente ao elemento ao qual está amarrado, usando a coordenada 2-D origem padrão localizada no canto superior esquerdo elemento adornado.

Aplicações comuns a adornos incluem:

  • Adicionar ganchos funcionais a um UIElement que permitem ao usuário manipular o elemento de alguma forma (redimensionar, rotacionar, reposicionar, etc.).

  • Fornece retornos visuais para indicar vários estados, ou em resposta a vários eventos.

  • Sobrepor decorações visuais em um UIElement.

  • Visualmente mascarar ou anular parte ou todo de um UIElement.

Windows Presentation Foundation (WPF) fornece uma estrutura básica para adorno de elementos visuais. A tabela a seguir lista os tipos primários usados quando adornando objetos, e seus propósitos. Seguem diversos exemplos de uso:

Adorner

Uma classe base abstrata da qual todas as implementações concretas de adornos herdam.

AdornerLayer

Uma classe representando uma camada de renderização para o(s) adorno(s) de um ou mais elementos adornados.

AdornerDecorator

Uma classe que habilita a camada de adorno a estar associada a uma coleção de elementos.

Implementando um Adorno Customizado

A estrutura de adornos fornecida por Windows Presentation Foundation (WPF) é destinada primariamente ao suporte para criação de adornos customizados. Um adorno customizado é criado implementando-se uma classe que herda da classe abstrata Adorner.

ObservaçãoObservação:

O pai de um Adorner é o AdornerLayer que processa o Adorner, não o elemento que está sendo adornado.

O exemplo a seguir mostra uma classe que implementa um adorno simples. O adorno de exemplo simplesmente adorna as quinas de um UIElement com círculos.

Public Class SimpleCircleAdorner
    Inherits Adorner
    Sub New(ByVal adornedElement As UIElement)
        MyBase.New(adornedElement)
    End Sub

    Protected Overrides Sub OnRender(ByVal drawingContext As System.Windows.Media.DrawingContext)
        MyBase.OnRender(drawingContext)
        Dim adornedElementRect As New Rect(AdornedElement.DesiredSize)
        Dim renderBrush As New SolidColorBrush(Colors.Green)
        renderBrush.Opacity = 0.2
        Dim renderPen As New Pen(New SolidColorBrush(Colors.Navy), 1.5)
        Dim renderRadius As Double
        renderRadius = 5.0

        'Draw a circle at each corner.
        drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopLeft, renderRadius, renderRadius)
        drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopRight, renderRadius, renderRadius)
        drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomLeft, renderRadius, renderRadius)
        drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomRight, renderRadius, renderRadius)
    End Sub
End Class
// Adorners must subclass the abstract base class Adorner.
public class SimpleCircleAdorner : Adorner
{
  // Be sure to call the base class constructor.
  public SimpleCircleAdorner(UIElement adornedElement)
    : base(adornedElement) 
  { 
  }

  // A common way to implement an adorner's rendering behavior is to override the OnRender
  // method, which is called by the layout system as part of a rendering pass.
  protected override void OnRender(DrawingContext drawingContext)
  {
    Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize);

    // Some arbitrary drawing implements.
    SolidColorBrush renderBrush = new SolidColorBrush(Colors.Green);
    renderBrush.Opacity = 0.2;
    Pen renderPen = new Pen(new SolidColorBrush(Colors.Navy), 1.5);
    double renderRadius = 5.0;

    // Draw a circle at each corner.
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopLeft, renderRadius, renderRadius);
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopRight, renderRadius, renderRadius);
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomLeft, renderRadius, renderRadius);
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomRight, renderRadius, renderRadius);
  }
}

A imagem a seguir mostra o SimpleCircleAdorner aplicado a um TextBox.

Exemplo de adornos: Um TextBox adorned

Comportamento de Renderização para Adornos

É importante notar que adornos não incluem nenhum comportamento de renderização intrínseco; certificar-se que um adorno renderiza é responsabilidade do implementador do adorno. Uma maneira comum de implementador comportamento de renderização é sobrescrevendo o método OnRenderSizeChanged e usando um ou mais objetos DrawingContext para renderizar os visuais do adorno conforme necessário (como visto no exemplo acima).

ObservaçãoObservação:

Qualquer coisa colocada na camada de adorno é renderizada em cima do resto de qualquer estilo que você tenha definido. Em Outros palavras, adorners estão sempre visualmente na parte superior e não pode ser substituídas usando ordem-z.

Eventos e Teste de Clique

Adornos recebem eventos de entrada assim como qualquer outro FrameworkElement. Porque o adorno sempre possui um z-order maior que qualquer elemento que adorne, o adorno recebe eventos de entrada (como Drop ou MouseMove) que podem ser direcionados ou elemento adornado subjacente. Um adorno pode escutar certos eventos de entrada e passá-los ao elemento adornado subjacente redisparando o evento.

Para habilitar o teste de clique pass-through de elementos debaixo de um adorno, defina a propriedade de teste de clique IsHitTestVisible para falso no adorno. Para obter mais informações sobre teste de clique, veja

Hit Testing in the Visual Layer.

Adornado um Único UIElement

Para associar um adorno a um UIElement particular, siga esses passos:

  1. telefonar o método estático GetAdornerLayer Para obter um AdornerLayer objeto para o UIElement para ser adornados. GetAdornerLayer percorre a árvore visual, começando com o especificado UIElemente retorna a primeira camada de adorno que encontrar. (Se nenhuma camada de adorno é encontrada, o método retorna nulo.)

  2. Chame o método Add para associar o adorno ao UIElement alvo.

O seguinte exemplo associa um SimplesAdornoCircular (mostrado acima) a um TextBox nomeada minhaCaixaDeTexto.

myAdornerLayer = AdornerLayer.GetAdornerLayer(myTextBox)
myAdornerLayer.Add(New SimpleCircleAdorner(myTextBox))
myAdornerLayer = AdornerLayer.GetAdornerLayer(myTextBox);
myAdornerLayer.Add(new SimpleCircleAdorner(myTextBox));
ObservaçãoObservação:

Using Extensible Application Markup Language (XAML) Para BIND um adorno a outro elemento atualmente não há suporte.

Adornando os Filhos de um Painel

Para associar um Adorner aos filhos de um Panel, siga esses passos:

 

  1. Chame o método static GetAdornerLayer para encontrar uma camada de adorno para o elemento cujos filhos serão adornados.

  2. Enumere todos os filhos do elemento pai e chame o método Add para associar um adorno a cada elemento filho.

O exemplo a seguir associa um SimpleCircleAdorner (mostrado acima) aos filhos de um StackPanel chamado myStackPanel.

For Each toAdorn As UIElement In myStackPanel.Children
    myAdornerLayer.Add(New SimpleCircleAdorner(toAdorn))
Next

foreach (UIElement toAdorn in myStackPanel.Children)
  myAdornerLayer.Add(new SimpleCircleAdorner(toAdorn));

Consulte também

Conceitos

Visão geral de Formas e Desenho básico no WPF

Pintura com Imagens, Desenhos e Visuais

Visão Geral de Objetos de Desenho

Referência

AdornerHitTestResult

Outros recursos

Tópicos de Como Fazer sobre Adorners

Exemplos de adorners