Compartilhar via


Árvores em WPF

Em muitas tecnologias, elementos e componentes são organizados em um árvore estrutura em que os desenvolvedores de manipulam diretamente a árvore para afetar o renderização de um aplicativo. Windows Presentation Foundation (WPF) também usa vários metáforas de estrutura de árvore para definir relacionamentos entre elementos do programa.

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

  • Árvores em WPF
  • A árvore lógica
  • A árvore visual
  • Árvores, elementos de conteúdo e hosts de conteúdo
  • Passagem da Árvore
  • Rotas para eventos direcionados como uma "árvore"
  • Recursos e árvores
  • Tópicos relacionados

Árvores em WPF

A principal estrutura de árvore em WPF é a árvore elemento. Se for criar uma página de aplicativo no XAML, a estrutura de árvore é criada com base nas relações de aninhamento dos elementos na marcação. Se for criar um aplicativo em código, a estrutura de árvore é criada com base em como os valores de propriedade são atribuídos para as propriedades que implementam o modelo de conteúdo para um determinado elemento. In Windows Presentation Foundation (WPF), na verdade, há duas maneiras de que a árvore de elemento é processada e conceitualizam: sistema autônomo a árvore lógica e sistema autônomo a árvore Visual. As distinções entre a árvore lógica e a árvore visual não são sempre necessariamente importantes, mas ocasionalmente podem causar problemas com determinados subsistemas WPF e afetar opções feitas na marcação ou código.

Mesmo que a árvore lógica ou a árvore visual não sejam manipuladas diretamente, entender os conceitos de como as árvores interagem é uma maneira para entender como a herança de propriedades e roteamento de eventos funcionam no WPF.

A árvore lógica

Em WPF, adiciona-se conteúdo a elementos usando propriedades. Por exemplo, adicionam-se itens a um controle ListBox usando sua propriedade Items. Fazendo isso, é colocar itens em ItemCollection do controle ListBox. Para adicionar elementos a um DockPanel, use sua propriedade Children. Aqui, adicionam-se elementos à UIElementCollection do DockPanel. Para um exemplo de código, consulte Como: Adicionar um elemento dinamicamente.

Em Extensible Application Markup Language (XAML), quando itens da lista são colocados em um ListBox ou controles ou outros elementos em um DockPanel, também se usam o Items e propriedades Children, explícita ou implicitamente, como no exemplo a seguir.

<DockPanel
  Name="ParentElement"
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  >

  <!--implicit: <DockPanel.Children>-->
  <ListBox DockPanel.Dock="Top">
    <!--implicit: <ListBox.Items>-->
    <ListItem>
      <Paragraph>Dog</Paragraph>
    </ListItem>
    <ListItem>
      <Paragraph>Cat</Paragraph>
    </ListItem>
    <ListItem>
      <Paragraph>Fish</Paragraph>
    </ListItem>
    <!--implicit: </ListBox.Items>-->
  </ListBox>
  <Button Height="20" Width="100" DockPanel.Dock="Top">Buy a Pet</Button>

  <!--implicit: </DockPanel.Children>-->
</DockPanel>

Observe que as marcas do elemento de propriedade não são explicitamente necessárias porque o leitor XAML infere os elementos de propriedade ao criar a representação de objetos em tempo de execução do arquivo executável do aplicativo. Para obter mais informações sobre como XAML sintaxe mapeia para o Consulte árvore e Rótulos inferidas, lógico criado Terminologia de sintaxe XAML ou XAML Overview. O elemento gráfico a seguir fornece uma exibição conceitual da árvore de lógica que é construído em time de execução (a ramificar para o botão é omitida do elemento gráfico de).

Esquema da aparência da árvore lógica genérica

Diagrama de árvore

O objetivo de árvore lógica

A árvore lógica existe de modo que modelos de conteúdo possam prontamente iterar sobre seus elementos filho possíveis, e de modo que modelos de conteúdo podem ser extensíveis. Além disso, a árvore lógica fornece uma estrutura para determinadas notificações, como quando todos os elementos na árvore lógica são carregados.

Além disso, referências de recursos são resolvidas olhando para cima através de árvore lógica para coleções Resources no elemento solicitante inicial e, em seguida, nos elementos pai. A árvore lógica é usada para pesquisa de recursos quando ambas a árvore lógica e a árvore visual estão presentes. Para obter mais informações sobre recursos, consulte Visão geral sobre Recursos.

Substituindo a árvore lógica

Autores de controle avançados podem substituir a árvore lógica, substituindo várias APIs que definem como um objeto geral ou o modelo de conteúdo adiciona ou remove elementos dentro da árvore lógica. Para obter um exemplo de como substituir a árvore lógica, consulte Como: Override the Logical Tree.

Herança de Valor de Propriedade

A herança de valores de propriedade opera por uma árvore híbrida. Os metadados reais que contém a propriedade Inherits que permite a herança de propriedades é a classe WPF framework-level FrameworkPropertyMetadata. Portanto, tanto o pai que contém o valor original quanto o elemento filho que herda devem ser ambos FrameworkElement ou FrameworkContentElement, e eles devem ser ambos parte de alguma árvore lógica. No entanto, a árvore lógica de pai versus filho é permitida ser separada, com herança de valor da propriedade capaz de perpetuar por um elemento visual interveniente que não está em uma árvore lógica. Para que a herança de valor da propriedade trabalhe de forma consistente por tal limite, a propriedade que herda deve ser registrada como uma propriedade anexada. A árvore exata usada para a herança de propriedades não pode ser totalmente prevista por um método utilitário de classe auxiliar, mesmo em tempo de execução. Para obter mais informações, consulte Herança de Valor de Propriedade.

A árvore visual

Além do conceito de árvore lógica, há também o conceito da árvore visual em WPF. A árvore visual descreve a estrutura dos elementos visuais representados pela classe base Visual. Ao escrever um modelo para um controle, está se definindo ou redefinindo a árvore visual que se aplica para esse controle. A árvore visual também é de interesse para os desenvolvedores que desejam o controle de baixo nível sobre desenho por motivos de desempenho e otimização. Uma exposição de árvore visual como parte de programação de aplicativo WPF convencional é que rotas de eventos para um evento roteado principalmente viajam junto à árvore visual, não à árvore lógica. Esta sutileza do comportamento do evento roteado pode não ser imediatamente aparente, a menos que seja um autor de controle. Roteamento através de árvore visual ativa controles que implementam composição no nível visual para manipular eventos ou criar configuradores de eventos.

Árvores, elementos de conteúdo e hosts de conteúdo

Elementos de conteúdo (classes que derivam de ContentElement) não fazem parte da árvore de visual; eles não herdam de Visual e não têm uma representação visual. Para aparecer em um interface do usuário de alguma forma, um ContentElement deve ser hospedado em um host de conteúdo que é tantoum Visual quanto um elemento de árvore lógica, geralmente um FrameworkElement. É possível conceber que o host de conteúdo é um pouco como um "navegador" para o conteúdo e escolhe como exibir esse conteúdo dentro da região da tela que o host controla. Quando o conteúdo está hospedado, o conteúdo pode se tornar um participante em determinados processos de árvore que são normalmente associadas com a árvore visual. Geralmente, a classe host FrameworkElement inclui código de implementação que adiciona qualquer ContentElement hospedado para a rota de eventos através de subnós da árvore lógica de conteúdo, mesmo se o conteúdo hospedado não fizer parte de árvore visual verdadeira. Isso é necessário para que um ContentElement possa ser fonte de um evento roteado que roteia qualquer elemento diferente de si próprio.

Passagem da Árvore

A classe LogicalTreeHelper fornece os métodos GetChildren, GetParent e FindLogicalNode para passagem da árvore lógica. Na maioria dos casos, não é preciso percorrer a árvore lógica de controles existentes, porque esses controles quase sempre expõem seus elementos filho como uma propriedade de coleção dedicada que oferece suporte a APIs de coleções, como Adicionar, um indexador e assim por diante. Passagem da árvore é principalmente um cenário que é usado por autores de controle que não queiram derivar de padrões de controle desejados, como ItemsControl ou Panel onde propriedades de coleções já são definidas, e que pretendem fornecer seu próprio suporte a propriedades de coleções.

A árvore visual também oferece suporte a uma classe auxiliar para passagem da árvore visual, VisualTreeHelper. A árvore visual não é exposta como convenientemente através das propriedades de controle específico, portanto, a classe VisualTreeHelper é a maneira recomendada para percorrer a árvore visual se for necessário para sua situação de programação. Para obter mais informações, consulte Visão Geral sobre Renderização de Gráficos do Windows Presentation Foundation.

Rotas para eventos direcionados como uma "árvore"

Conforme foi mencionado antes, a rota de um evento roteado efetivamente viaja junto a uma árvore, viajando tanto para cima ou para baixo da árvore dependendo se é um evento roteado de encapsulamento ou de propagação. O conceito de rota de evento não tem uma classe auxiliar diretamente de suporte que pode ser usada para percorrer a rota do evento independentemente de gerar um evento que realmente roteia. Há uma classe que representa a rota, EventRoute, mas os métodos dessa classe geralmente são somente para uso interno.

Recursos e árvores

Pesquisa de recurso basicamente percorre a árvore lógica. Objetos que não estão na árvore lógica podem fazer referência a recursos, mas a pesquisa começa no ponto onde o objeto está conectado à árvore lógica. Somente os nós de árvore lógica podem ter uma propriedade Resources que contém um ResourceDictionary, portanto, significa que há nenhuma vantagem em atravessar a árvore visual procurando recursos.

No entanto, pesquisa de recursos também pode se estender além da árvore lógica imediata. Para marcação de aplicativo, a pesquisa de recurso pode então continuar adiante para recursos do aplicativo e para suporte a temas valores do sistema. Os próprios temas também podem fazer referência a valores do sistema fora da árvore lógica de tema se as referências de recurso forem dinâmicas. Para obter mais informações sobre recursos e a lógica de pesquisa, consulte Visão geral sobre Recursos.

Consulte também

Conceitos

Input Overview

Visão Geral sobre Renderização de Gráficos do Windows Presentation Foundation

Visão geral sobre eventos roteados

Inicialização de Elementos de Objeto que não estão numa Árvore de Elementos

Arquitetura WPF