Compartilhar via


Namescopes do WPF XAML

Namescopes do XAML são um conceito que identifica objetos que são definidos em XAML. Os nomes de um namescope XAML podem ser usados para estabelecer relações entre os nomes definidos pelo XAML de objetos e seus equivalentes de instância em uma árvore de objetos. Normalmente, a XAML namescopes em WPF código gerenciado são criados ao carregar as raízes de página XAML individuais para um aplicativo de XAML. Namescopes XAML como objeto de programação são definidos pelo INameScope interface e também são implementadas pela classe prática NameScope.

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

  • Namescopes in Loaded XAML Applications
  • Namescopes do XAML em estilos e modelos
  • Namescopes XAML e APIs de nome
  • Tópicos relacionados

Namescopes in Loaded XAML Applications

Em um contexto de ciências de computador ou uma programação mais abrangente, os conceitos de programação freqüentemente incluem o princípio de um identificador exclusivo ou o nome que pode ser usado para acessar um objeto. Para sistemas que usam nomes ou identificadores, o namescope define os limites dentro de um processo ou técnica irá procurar se for solicitado a um objeto do nome ou os limites em que a exclusividade de identificação de nomes é aplicada. Esses princípios gerais são verdadeiros para namescopes do XAML. No WPF, o XAML namescopes são criados no elemento raiz de uma página XAML quando a página é carregada. Cada nome especificado dentro da página XAML, iniciando na raiz de página é adicionado a um namescope pertinente do XAML.

No WPF XAML, os elementos que são elementos de raiz comuns (como Page, e Window) sempre controlar um XAML namescope. Se um elemento, como FrameworkElement ou FrameworkContentElement é o elemento raiz da página na marcação, um XAML processador adiciona um Page raiz implicitamente, para que o Page pode fornecer um namescope XAML de trabalho.

Observação

Ações de compilação do WPF criam um namescope XAML para uma produção de XAML, mesmo que não Name ou x:Name os atributos são definidos em qualquer elemento no XAML marcação.

Se você tentar usar o mesmo nome duas vezes em qualquer namescope XAML, uma exceção. Para WPF XAML que faz parte de um aplicativo compilado e code-behind, a exceção em tempo de compilação por ações de compilação do WPF, ao criar a classe gerada para a página durante a compilação da marcação inicial. Para XAML que não é compilado em marcação, por qualquer ação de compilação, exceções relacionadas a problemas de namescope XAML podem ser aumentadas quando o XAML é carregado. Designers XAML também podem antecipar problemas de namescope do XAML em tempo de design.

Adicionando objetos a árvores de objeto de Runtime

No momento em que o XAML é analisado representa o momento que um namescope do WPF XAML é criado e definido. Se você adicionar um objeto a uma árvore de objetos em um ponto no tempo após o XAML que produziu a árvore é analisado, um Name ou x:Name valor de um novo objeto não automaticamente atualizar as informações em um namescope XAML. Para adicionar um nome para um objeto em um namescope do WPF XAML, depois que o XAML é carregado, deve chamar a implementação apropriada de RegisterName no objeto que define o namescope XAML, que é normalmente o XAML página raiz. Se o nome não estiver registrado, o objeto adicionado não pode ser referenciado pelo nome através de métodos como FindName, e você não pode usar esse nome para o direcionamento de animação.

O cenário mais comum para desenvolvedores de aplicativos é que você usará RegisterName para registrar nomes em namescope o XAML na raiz atual da página. RegisterNameé a parte de um cenário de mportant de storyboards que objetos de destino para animações. For more information, see Visão geral sobre Storyboards.

Se você chamar RegisterName em um objeto diferente do objeto que define o namescope XAML, o nome ainda está registrado para o namescope XAML que o objeto de chamada é mantido dentro, como se você tivesse chamado RegisterName no XAML namescope definição objeto.

Namescopes XAML no código

Você pode criar e usar o XAML namescopes no código. As APIs e os conceitos envolvidos na criação de namescope do XAML são a mesma, mesmo para o uso de código puro, porque o processador XAML para WPF usa essas APIs e conceitos, quando ele processa o XAML em si. Os conceitos e a API existem principalmente para fins de ser capaz de localizar os objetos por nome em uma árvore de objetos é normalmente definida parcial ou inteiramente em XAML.

Para aplicativos que são criados por programação e não a partir de XAML carregado, o objeto que define um namescope XAML deve implementar INameScope, ou ser um FrameworkElement ou FrameworkContentElement derivado da classe, para oferecer suporte a criação de um namescope do XAML em instâncias.

Além disso, para qualquer elemento que não é carregado e processado por um processador XAML, o namescope XAML para o objeto não é criado ou inicializado por padrão. Você deve criar um novo namescope XAML para qualquer objeto que você pretende registrar nomes em subseqüentemente explicitamente. Para criar um namescope XAML, você chamar estática SetNameScope método. Especifique o objeto que será o proprietário-la como a dependencyObject parâmetro e uma nova NameScope chamada de construtor, como o value parâmetro.

Se o objeto fornecido como dependencyObject para SetNameScope não é um INameScope implementação, FrameworkElement ou FrameworkContentElement, chamando RegisterName em qualquer filho elementos terão nenhum efeito. Se você não conseguir criar o novo namescope XAML explicitamente, chamadas para RegisterName irá disparar uma exceção.

Para obter um exemplo do uso do XAML namescope APIs no código, consulte Como: Definir um escopo de nomes.

Namescopes do XAML em estilos e modelos

Estilos e modelos WPF fornecem a capacidade de reutilizar e reaplicar o conteúdo em uma forma simples. No entanto, estilos e modelos também podem incluir elementos com nomes XAML definidos no nível do modelo. That same template might be used multiple times in a page. Por esse motivo, estilos e modelos de definem seus próprios namescopes XAML, independente de qualquer local na árvore de uma objeto onde o estilo ou o modelo é aplicado.

Consider the following example:

<Page
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  >
  <Page.Resources>
    <ControlTemplate x:Key="MyButtonTemplate" TargetType="{x:Type Button}">
      <Border BorderBrush="Red" Name="TheBorder" BorderThickness="2">
        <ContentPresenter/>
      </Border>      
    </ControlTemplate>
  </Page.Resources>
  <StackPanel>
    <Button Template="{StaticResource MyButtonTemplate}">My first button</Button>
    <Button Template="{StaticResource MyButtonTemplate}">My second button</Button>
  </StackPanel>
</Page>

Here, the same template is applied to two different buttons. Se a modelos não tinha namescopes discreto de XAML, o TheBorder nome usado no modelo causaria uma colisão de nomes no XAML namescope. Cada instanciação do modelo tem sua própria namescope XAML, neste exemplo, namescope XAML do modelo de cada instanciado conteria exatamente um nome.

Estilos também definem sua própria namescope XAML, principalmente para que partes de storyboards podem ter determinados nomes atribuídos. These names enable control specific behaviors that will target elements of that name, even if the template was re-defined as part of control customization.

Devido o XAML separado namescopes, Localizando elementos nomeados em um modelo é mais difíceis de encontrar um sem modelo denominado elemento em uma página. You first need to determine the applied template, by getting the Template property value of the control where the template is applied. Then, you call the template version of FindName, passing the control where the template was applied as the second parameter.

If you are a control author and you are generating a convention where a particular named element in an applied template is the target for a behavior that is defined by the control itself, you can use the GetTemplateChild method from your control implementation code. The GetTemplateChild method is protected, so only the control author has access to it.

Se você está trabalhando em um modelo e a necessidade de obter o namescope XAML onde o modelo é aplicado, obter o valor de TemplatedParente então chamar FindName lá. An example of working within the template would be if you are writing the event handler implementation where the event will be raised from an element in an applied template.

Namescopes XAML e APIs de nome

FrameworkElement has FindName, RegisterName and UnregisterName methods. Se você chamar esses métodos no objeto possui um namescope XAML, os métodos chamam os métodos de namescope XAML relevante. Caso contrário, o elemento pai é verificado para ver se ele é o proprietário de um namescope XAML e esse processo continua recursivamente até encontra um namescope XAML (por causa do comportamento de processador XAML, lá é garantido para ser um namescope XAML na raiz). FrameworkContentElementpossui análogos comportamentos, com exceção de que nenhum FrameworkContentElement será o proprietário nunca um namescope XAML. The methods exist on FrameworkContentElement so that the calls can be forwarded eventually to a FrameworkElement parent element.

SetNameScopeé usado para mapear um novo namescope XAML para um objeto existente. Você pode chamar SetNameScope mais de uma vez para redefinir ou limpar o XAML namescope, mas que não é um comum uso. Also, GetNameScope is not typically used from code.

Implementações de Namescope XAML

The following classes implement INameScope directly:

ResourceDictionarynão usar nomes XAML ou namescopes; Ele usa chaves em vez disso, porque ele é uma implementação de dicionário. A única razão que ResourceDictionary implementa INameScope é para que ele possa gerar exceções para código do usuário que ajudam a esclarecer a distinção entre uma verdadeira namescope XAML e como um ResourceDictionary lida com chaves e também para garantir que o XAML namescopes não são aplicadas a um ResourceDictionary por todos os elementos pai.

FrameworkTemplate and Style implement INameScope through explicit interface definitions. As implementações explícitas permitem esses namescopes XAML se comporte convencionalmente quando eles são acessados por meio de INameScope interface, que é como o XAML namescopes são comunicadas por WPF processos internos. Mas as definições de interface explícita não fazem parte da superfície de API convencional da FrameworkTemplate e Style, porque você raramente precisará chamar o INameScope métodos em FrameworkTemplate e Style diretamente e em vez disso use outra API como GetTemplateChild.

As seguintes classes definem sua próprias namescope XAML usando o System.Windows.NameScope classe auxiliar e conectando-se a sua implementação de namescope XAML por meio do NameScope.NameScope anexado propriedade:

Consulte também

Referência

x: nome de diretiva

Conceitos

Namespaces XAML e o mapeamento de Namespace para WPF XAML