Visão geral do XAML (WPF)
Este tópico descreve os recursos da linguagem XAML e demonstra como você pode usar o XAML para escrever Windows Presentation Foundation (WPF) aplicativos. Este tópico descreve especificamente a XAML conforme implementado pelo WPF. XAML em si é um conceito de linguagem maior que WPF.
Este tópico contém as seguintes seções.
- O que é XAML?
- Sintaxe XAML em breve
- Case and Whitespace in XAML
- Markup Extensions
- Conversores de tipo
- Elementos de raiz XAML e Namespaces XAML
- Prefixos personalizados e os tipos personalizados em XAML
- Events and XAML Code-Behind
- XAML elementos nomeado
- Attached Properties and Attached Events
- Tipos base e XAML
- XAML Security
- Loading XAML from Code
- What's Next
- Tópicos relacionados
O que é XAML?
O XAML é uma linguagem de marcação declarativa. Como aplicada para o .NET Framework modelo de programação, XAML simplifica a criação de um UI para um .NET Framework aplicativo. Você pode criar visível UI elementos na marcação declarativa de XAML e, em seguida, separado do UI a definição da lógica de tempo de execução usando arquivos code-behind, ingressados a marcação por meio de definições de classe parcial. Diretamente, XAML representa a instanciação de objetos em um conjunto específico de fazendo tipos definidos em assemblies. Isso é diferente da maioria das outras linguagens de marcação, que são, em geral, uma linguagem interpretada sem uma ligação direta para um sistema de tipos de backup. XAML permite onde partes separadas podem trabalhar em um fluxo de trabalho do UI e a lógica de um aplicativo, usando ferramentas potencialmente diferentes.
Quando representados como texto, arquivos XAML são arquivos XML que geralmente têm o .xaml extensão. Os arquivos podem ser codificados por qualquer XML de codificação, mas a codificação como UTF-8 é normal.
O exemplo a seguir mostra como você pode criar um botão como parte de um UI. Este exemplo destina-se apenas para lhe dar um tipo de como o XAML representa comuns UI programação metáforas (não é um exemplo completo).
<StackPanel>
<Button Content="Click Me"/>
</StackPanel>
Sintaxe XAML em breve
As seções a seguir explicam as formas básicas de sintaxe XAML e dar um exemplo de marcação curta. Estas seções não se destinam a fornecer informações completas sobre cada formulário de sintaxe, como, por exemplo, como esses itens são representados no sistema de tipo de backup. Para obter mais informações sobre as especificidades da sintaxe XAML para cada uma das formas de sintaxe introduzidas neste tópico, consulte Sintaxe XAML em detalhes.
Grande parte do material nas próximas seções serão elementar, se você tiver familiaridade anterior com a linguagem XML. Esta é uma conseqüência de um dos princípios básicos do design do XAML. Idioma de XAML de XAML A define os conceitos de sua própria, mas esses conceitos trabalham dentro do formulário de idioma e a marcação XML.
XAML Object Elements
Normalmente, um elemento de objeto declara uma instância de um tipo. Esse tipo é definido em módulos (assemblies) que fornecem os tipos de backup para uma tecnologia que utiliza o XAML como uma linguagem.
Sintaxe de elemento de objeto sempre começa com um colchete de abertura (<). Isso é seguido do nome do tipo de onde você deseja criar uma instância. (O nome pode possivelmente inclui um prefixo, um conceito que será explicado posteriormente). Depois disso, opcionalmente você pode declarar atributos no elemento de objeto. Para concluir a marca de elemento de objeto, terminar com um colchete de fechamento (>). Você pode usar um formulário de auto-fechamento não tem qualquer conteúdo, Concluindo a marca com uma barra invertida e o colchete angular em sucessão de fechamento (/ >). Por exemplo, veja o trecho de marcação mostrada anteriormente novamente:
<StackPanel>
<Button Content="Click Me"/>
</StackPanel>
Isso especifica dois elementos do objeto: <StackPanel>(com o conteúdo e uma marca de fechamento mais tarde), e <Button .../> (o formulário auto-fechamento, com vários atributos). Os elementos do objeto StackPanel e Button cada mapa para o nome de uma classe que é definido por WPF e faz parte o WPF assemblies. Quando você especifica uma marca de elemento de objeto, você criar uma instrução de processamento para criar uma nova instância do XAML. Cada instância é criada chamando o construtor padrão do tipo subjacente ao analisar e carregar o XAML.
Sintaxe de atributo (Propriedades)
Propriedades de um objeto geralmente podem ser expressos como atributos do elemento de objeto. Uma sintaxe de atributo nomeia a propriedade que está sendo definida na sintaxe de atributo, seguido pelo operador de atribuição (=). O valor de um atributo sempre é especificado como uma seqüência contida entre aspas.
Sintaxe de atributo é a sintaxe mais simplificada de configuração da propriedade e a sintaxe mais intuitiva para os desenvolvedores que usaram as linguagens de marcação no passado. Por exemplo, a marcação a seguir cria um botão que possui texto vermelho e um plano de fundo azul, além de para exibir o texto especificado como Content.
<Button Background="Blue" Foreground="Red" Content="This is a button"/>
Property Element Syntax
Para algumas propriedades de um elemento de objeto, a sintaxe de atributo não é possível, porque o objeto ou as informações necessárias para fornecer o valor da propriedade não podem ser expresso adequadamente dentro das aspas e restrições de seqüência de caracteres da sintaxe de atributo. For these cases, a different syntax known as property element syntax can be used.
A sintaxe para a marca de início do elemento de propriedade é <typeName.propertyName>. Geralmente, o conteúdo dessa marca é um elemento de objeto do tipo que a propriedade toma como seu valor. Depois de especificar o conteúdo, você deve fechar o elemento de propriedade com uma marca de fim. A sintaxe para a marca de fim é </typeName.propertyName>.
Se for possível uma sintaxe de atributo usando a sintaxe de atributo é normalmente mais conveniente e permite uma marcação mais compacta, mas geralmente é apenas uma questão de estilo, não é uma limitação técnica. The following example shows the same properties being set as in the previous attribute syntax example, but this time by using property element syntax for all properties of the Button.
<Button>
<Button.Background>
<SolidColorBrush Color="Blue"/>
</Button.Background>
<Button.Foreground>
<SolidColorBrush Color="Red"/>
</Button.Foreground>
<Button.Content>
This is a button
</Button.Content>
</Button>
Sintaxe de coleção
A linguagem XAML inclui algumas otimizações que produzem marcação mais legível. Uma otimização de tal é que, se uma determinada propriedade leva um tipo de coleção, em seguida, os itens que você declara em marcação como elementos filhos dentro da parte de tornar-se do valor da propriedade da coleção. Nesse caso, uma coleção de elementos do objeto filho é o valor que está sendo definido como a propriedade de coleção.
O exemplo a seguir mostra a sintaxe de coleção para definir valores de GradientStops propriedade:
<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<!-- no explicit new GradientStopCollection, parser knows how to find or create -->
<GradientStop Offset="0.0" Color="Red" />
<GradientStop Offset="1.0" Color="Blue" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
XAML Content Properties
O XAML especifica um recurso de linguagem na qual uma classe pode designar exatamente uma de suas propriedades para a propriedade de conteúdo XAML. Elementos filho do elemento objeto são usados para definir o valor da propriedade de conteúdo. Em outras palavras, para a propriedade de conteúdo com exclusividade, você pode omitir um elemento de propriedade ao definir essa propriedade na marcação XAML e produzir uma metáfora mais visível do pai/filho na marcação.
Por exemplo, Border Especifica uma propriedade content de Child. Os dois seguintes Border elementos são tratados de forma idêntica. A primeira tira proveito da sintaxe da propriedade content e omite a Border.Child elemento de propriedade. Mostra a segunda Border.Child explicitamente.
<Border>
<TextBox Width="300"/>
</Border>
<!--explicit equivalent-->
<Border>
<Border.Child>
<TextBox Width="300"/>
</Border.Child>
</Border>
Como regra da linguagem XAML, o valor de uma propriedade de conteúdo XAML deve ser dada inteiramente antes ou após inteiramente a outros elementos de propriedade desse elemento de objeto. For instance, the following markup does not compile:
<Button>I am a
<Button.Background>Blue</Button.Background>
blue button</Button>
Para obter mais informações sobre essa restrição de propriedades de conteúdo XAML, consulte o "propriedades de conteúdo XAML" seção de Sintaxe XAML em detalhes.
Conteúdo de texto
Um pequeno número de elementos XAML diretamente pode processar o texto como seu conteúdo. Para habilitar isso, um dos seguintes casos deve ser verdadeiro:
A classe deve declarar uma propriedade de conteúdo e propriedade de conteúdo deve ser do tipo pode ser atribuído a uma seqüência de caracteres (o tipo pode ser Object). Por exemplo, qualquer ContentControl usa Content como sua propriedade de conteúdo e ele é o tipo de Object, e isso suporta o seguinte uso em um prático ContentControl , como um Button: <Button>Hello</Button>.
O tipo deve declarar um conversor de tipo, caso o conteúdo do texto é usado como texto de inicialização para esse conversor de tipo. For example, <Brush>Blue</Brush>. Neste caso é menos comum na prática.
O tipo deve ser uma linguagem XAML conhecida primitiva.
Propriedades de conteúdo e a sintaxe de coleção combinada
Considere este exemplo:
<StackPanel>
<Button>First Button</Button>
<Button>Second Button</Button>
</StackPanel>
Aqui, cada Button é um elemento filho de StackPanel. This is a streamlined and intuitive markup that omits two tags for two different reasons.
Elemento de propriedade de StackPanel.Children omitido: StackPanelderiva de Panel. PanelDefine Panel.Children como sua propriedade de conteúdo XAML.
Elemento de objeto UIElementCollection omitido: O Panel.Children propriedade tem o tipo de UIElementCollection, que implementa IList. Marca de elemento da coleção pode ser omitida, as regras de XAML para o processamento de coleções, como IList. (Nesse caso, UIElementCollection , na verdade, não pode ser instanciado porque ele não expõe um construtor padrão e é por isso que o UIElementCollection elemento object é mostrado comentado).
<StackPanel>
<StackPanel.Children>
<!--<UIElementCollection>-->
<Button>First Button</Button>
<Button>Second Button</Button>
<!--</UIElementCollection>-->
</StackPanel.Children>
</StackPanel>
Sintaxe de atributo (eventos)
Sintaxe de atributo também pode ser usado para membros que são eventos, em vez de propriedades. Nesse caso, o nome do atributo é o nome do evento. Na implementação do WPF de eventos para o XAML, o valor do atributo é o nome de um manipulador que implementa o delegado do evento. Por exemplo, a seguinte marcação atribui um manipulador para o Click evento para um Button criado na marcação:
<Page
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ExampleNamespace.ExamplePage">
<Button Click="Button_Click" >Click Me!</Button>
</Page>
Não há mais eventos e o XAML no WPF do que apenas esse exemplo da sintaxe de atributo. Por exemplo, você deve estar imaginando o que o ClickHandler referenciada aqui representa e como é definido. Isso será explicado na próxima XAML Code-Behind e eventos seção deste tópico.
Case and Whitespace in XAML
Em geral, o XAML diferencia maiúsculas de minúsculas. Para fins de resolução de tipos de backup, WPF XAML diferencia maiúsculas de minúsculas pelas mesmas regras que o CLR diferencia maiúsculas de minúsculas. Elementos do objeto, propriedade e nomes de atributo devem ser especificados usando o casing confidencial quando comparado pelo nome, o tipo subjacente no assembly ou um membro de um tipo. Primitivos e palavras-chave de linguagem XAML também diferenciam maiúsculas de minúsculas. Sempre valores não diferenciam maiúsculas de minúsculas. Case sensitivity for values will depend on the type converter behavior associated with the property that takes the value, or the property value type. Por exemplo, as propriedades que levam a Boolean tipo pode levar uma true ou True como valores equivalentes, mas somente porque o analisador do WPF XAML nativo digite conversão de seqüência de caracteres para Boolean já permite esses como equivalentes.
Processadores de WPF XAML serializadores irá ignorar ou descartar todas as nonsignificant espaço em branco e será normalizar qualquer espaço em branco significativo. Isso é consistente com as recomendações de comportamento de espaço em branco padrão da especificação do XAML. Esse comportamento é geralmente apenas de conseqüência, quando você especifica as seqüências propriedades de conteúdo XAML. Em termos mais simples, XAML converte caracteres de espaço, alimentação de linha e guia a espaços e, em seguida, o preserva um espaço se encontradas no final de uma seqüência de caracteres contíguo. A explicação completa do tratamento de espaço em branco XAML não é abordada neste tópico. For details, see Processamento de Espaço em branco em XAML.
Markup Extensions
As extensões de marcação são um conceito de linguagem XAML. Quando usado para fornecer o valor de uma sintaxe de atributo, chaves ({ e }) indicam um uso de extensão de marcação. Esse uso direciona o XAML para sair do tratamento geral dos valores de atributo, como uma seqüência de caracteres literal ou um valor de seqüência conversível de processamento.
The most common markup extensions used in WPF application programming are Binding, used for data binding expressions, and the resource references StaticResource and DynamicResource. Usando as extensões de marcação, você pode usar a sintaxe de atributo para fornecer valores para propriedades, mesmo se essa propriedade não oferece suporte a uma sintaxe de atributo em geral. As extensões de marcação geralmente usam tipos de expressão intermediário para habilitar recursos como, por exemplo, adiando a valores ou fazer referência a outros objetos que só estão presentes em tempo de execução.
Por exemplo, a seguinte marcação define o valor de Style propriedade usando a sintaxe de atributo. O Style propriedade obtém uma instância da Style classe, que por padrão não pôde ser instanciado por uma seqüência de caracteres de sintaxe de atributo. But in this case, the attribute references a particular markup extension, StaticResource. When that markup extension is processed, it returns a reference to a style that was previously instantiated as a keyed resource in a resource dictionary.
<Page.Resources>
<SolidColorBrush x:Key="MyBrush" Color="Gold"/>
<Style TargetType="Border" x:Key="PageBackground">
<Setter Property="Background" Value="Blue"/>
</Style>
...
</Page.Resources>
<StackPanel>
<Border Style="{StaticResource PageBackground}">
...
</Border>
</StackPanel>
Para uma referência listagem de todas as extensões de marcação para XAML implementada especificamente no WPF, consulte Extensões do WPF XAML. Para obter uma lista de referência das extensões de marcação, que são definidos pelo System.Xaml e mais amplamente disponíveis para.Implementações de XAML do NET Framework, consulte Namespace XAML (x:) Recursos da linguagem. Para obter mais informações sobre conceitos de extensão de marcação, consulte As extensões de marcação e o WPF XAML.
Conversores de tipo
No Sintaxe de atributo seção, afirmou que o valor do atributo deve ser capaz de ser definida por uma seqüência de caracteres. Manipulação básica, nativa de como seqüências de caracteres são convertidas em outros tipos de objeto ou valores primitivos se baseia o String próprio, além de para nativo tipo processamento para determinados tipos como DateTime ou Uri. Mas muitas WPF tipos ou membros desses tipos de estendem o atributo de seqüência básica, processamento de comportamento, de tal forma que as instâncias de tipos de objeto mais complexos podem ser especificadas como seqüências de caracteres e atributos.
O Thickness estrutura é um exemplo de um tipo que tem uma conversão de tipo habilitada para usos XAML. Thicknessindica as medidas dentro de um retângulo aninhado e é usado como o valor para propriedades como Margin. Colocando um conversor de tipo em Thickness, todas as propriedades que usam um Thickness são mais fáceis de especificar em XAML, pois eles podem ser especificados como atributos. O exemplo a seguir usa uma sintaxe de atributo e conversão de tipo para fornecer um valor para um Margin:
<Button Margin="10,20,10,30" Content="Click me"/>
O exemplo anterior de sintaxe de atributo é equivalente ao seguinte exemplo de sintaxe mais detalhado, onde o Margin em vez disso, é definida por meio da sintaxe de elemento de propriedade contendo um Thickness elemento de objeto. Os quatro principais propriedades de Thickness são definidos como atributos na nova instância:
<Button Content="Click me">
<Button.Margin>
<Thickness Left="10" Top="20" Right="10" Bottom="30"/>
</Button.Margin>
</Button>
Observação
Também há um número limitado de objetos onde a conversão de tipo é a maneira pública somente para definir uma propriedade desse tipo sem envolver uma subclasse, porque o próprio tipo não tem um construtor padrão.An example is Cursor.
Para obter mais informações sobre como a conversão de tipo e seu uso para atributo há suporte para sintaxe, consulte TypeConverters and XAML.
Elementos de raiz XAML e Namespaces XAML
Um arquivo XAML deve ter somente um elemento raiz, para ser tanto um bem-formado XML de arquivo e um arquivo XAML válido. Para cenários típicos do WPF, você usar um elemento de raiz tem um significado de destaque no modelo de aplicativo do WPF (por exemplo, Window ou Page para uma página, ResourceDictionary para um dicionário externo, ou Application para a definição de aplicativo). O exemplo a seguir mostra o elemento raiz de um típico arquivo XAML para um WPF página, com o elemento raiz do Page.
<Page
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
...
</Page>
The root element also contains the attributes xmlns and xmlns:x. Esses atributos indicam a um processador XAML que XAML namespaces contêm as definições de tipo para fazer os tipos de marcação fará referência como elementos. O xmlns atributo especificamente indica o namespace XAML padrão. Dentro do namespace XAML padrão, os elementos do objeto na marcação podem ser especificados sem um prefixo. Para a maioria WPF cenários de aplicativos e para quase todos os exemplos fornecidos na WPF seções a SDK, namespace XAML padrão é mapeado para o WPF namespace https://schemas.microsoft.com/winfx/2006/xaml/presentation. O xmlns:x atributo indica um namespace de XAML adicional, que mapeia o namespace da linguagem XAML https://schemas.microsoft.com/winfx/2006/xaml.
Esse uso de xmlns definir um escopo para uso e o mapeamento de um namescope é consistente com a especificação XML 1.0. Namescopes do XAML são diferentes de XML namescopes somente um namescope XAML também implica que algo sobre como os elementos do namescope respaldados por tipos quando se trata de digitar o XAML de análise e resolução.
Observe que o xmlns atributos são somente estritamente necessários no elemento raiz de cada arquivo XAML. xmlnsas definições serão aplicadas a todos os elementos descendentes do elemento raiz (esse comportamento é consistente com a especificação XML 1.0 para novamente xmlns.) xmlns atributos também são permitidos em outros elementos sob a raiz e aplicariam a quaisquer elementos descendentes do elemento de definição. No entanto, as freqüente definição ou redefinição de namespaces XAML pode resultar em um estilo de marcação XAML que é difícil de ler.
O WPF a implementação do seu processador XAML inclui uma infra-estrutura que tem consciência dos assemblies do núcleo do WPF. O WPF assemblies de núcleo são conhecidos por conter os tipos que oferecem suporte a WPF mapeamentos para o namespace XAML padrão. Isso é habilitado por meio da configuração é parte da sua compilação do projeto de arquivo e o WPF construir e sistemas de projeto. Portanto, declarando o namespace XAML padrão como o padrão xmlns é tudo o que é necessário para fazer referência a elementos do XAML que venham de WPF assemblies.
O x: Prefixo
No exemplo do elemento de raiz anterior, o prefixo x: foi usado para mapear o namespace XAML https://schemas.microsoft.com/winfx/2006/xaml, que é o namespace XAML dedicado que suporta construções de linguagem XAML. Isso x: prefixo é usado para mapear esse namespace XAML nos modelos de projetos, exemplos e na documentação em todo este SDK. O namespace XAML para a linguagem XAML contém várias construções de programação que você usará com muita freqüência em seu XAML. A seguir está uma lista dos mais comuns x: construções de programação que você usará de prefixo:
x:Key: Define uma chave exclusiva para cada recurso em um ResourceDictionary (ou conceitos de dicionário semelhantes em outras estruturas). x:Keyprovavelmente a conta para 90% da x: usos, você verá na marcação de. um aplicativo WPF típico
X:Class: Especifica o CLR namespace e nome da classe para a classe que fornece o code-behind para uma página XAML. Você deve ter essa classe para dar suporte a code-behind, por que o modelo de programação do WPF e, portanto, consulte quase sempre x: mapeado, mesmo se houver sem recursos.
X:Name: Especifica um nome de objeto de tempo de execução para a instância que existe no código de tempo de execução depois que um elemento de objeto é processado. Em geral, você freqüentemente usará uma propriedade equivalente definido pelo WPF para X:Name. Tais propriedades mapeiam especificamente para um CLR fazendo a propriedade e, portanto, são mais convenientes para programação de aplicativo, de onde você usa freqüentemente código de tempo de execução para localizar os elementos nomeados de XAML inicializado. O mais comum é de propriedade FrameworkElement.Name. Você ainda pode usar X:Name quando o equivalente a WPF framework-nível Name não há suporte para a propriedade em um tipo específico. Isso ocorre em determinados cenários de animação.
x: estática: Permite que uma referência que retorna um valor estático, caso contrário, não é uma propriedade de compatível com o XAML.
Tipo de x:: Constrói uma Type referência com base em um nome de tipo. Isso é usado para especificar os atributos que assumem Type, como Style.TargetType, embora freqüentemente a propriedade tem string nativo-para-Type conversão de tal forma que o X: tipo o uso de extensão de marcação é opcional.
Há mais de programação construções no x: /XAML do prefixo de namespace, que são não como comum. For details, see Namespace XAML (x:) Recursos da linguagem.
Prefixos personalizados e os tipos personalizados em XAML
Para seus próprios assemblies personalizados ou para assemblies fora do núcleo do WPF de PresentationCore, PresentationFramework e WindowsBase, você pode especificar o conjunto como parte de um personalizado xmlns de mapeamento. Você pode então consultar tipos desse assembly em seu XAML, contanto que esse tipo está implementado corretamente para suportar os usos XAML que você está tentando executar.
A seguir é um exemplo bem básico do trabalho de prefixos personalizados como marcação de XAML. O prefixo custom é definido na marca do elemento raiz e mapeado para um conjunto específico que é empacotada e disponível com o aplicativo. Este assembly contém um tipo de NumericUpDown, que é implementado para dar suporte geral o uso XAML, bem como usar a herança de uma classe que permite sua inserção neste ponto específico em um modelo de conteúdo WPF XAML. Uma instância NumericUpDown controle é declarado como um elemento de objeto, usando o prefixo para que o analisador de XAML Saiba qual namespace XAML contém o tipo e, portanto, onde é o conjunto de backup que contém a definição de tipo.
<Page
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
xmlns:custom="clr-namespace:NumericUpDownCustomControl;assembly=CustomLibrary"
>
<StackPanel Name="LayoutRoot">
<custom:NumericUpDown Name="numericCtrl1" Width="100" Height="60"/>
...
</StackPanel>
</Page>
Para obter mais informações sobre tipos personalizados no XAML, consulte Classes de personalizadas para WPF e XAML.
Para obter mais informações sobre como namespaces XML e os espaços para nome do código fazendo em assemblies estão relacionados, consulte Namespaces XAML e o mapeamento de Namespace para WPF XAML.
Events and XAML Code-Behind
A maioria dos WPF aplicativos consistem em marcação XAML e o código-behind. Em um projeto, o XAML é gravado como um .xaml arquivo e um CLR linguagem como Microsoft Visual Basic ou C# é usada para gravar um arquivo code-behind. Quando um arquivo XAML é compilada como parte dos modelos de programação e de aplicativos WPF de marcação, a localização do XAML code-behind para um arquivo XAML é identificado, especificando um espaço para nome de arquivo e de classe como a x:Class atributo do elemento raiz do XAML.
In the examples so far, you have seen several buttons, but none of these buttons had any logical behavior associated with them yet. The primary application-level mechanism for adding a behavior for an object element is to use an existing event of the element class, and to write a specific handler for that event that is invoked when that event is raised at run time. The event name and the name of the handler to use are specified in the markup, whereas the code that implements your handler is defined in the code-behind.
<Page
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ExampleNamespace.ExamplePage">
<Button Click="Button_Click" >Click Me!</Button>
</Page>
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
Dim b As Button = e.Source
b.Foreground = Brushes.Red
End Sub
namespace ExampleNamespace
{
public partial class ExamplePage
{
void Button_Click(object sender, RoutedEventArgs e)
{
Button b = e.Source as Button;
b.Foreground = Brushes.Red;
}
}
}
Observe que o arquivo code-behind usa o namespace CLR ExampleNamespace e declara ExamplePage como uma classe parcial dentro desse namespace. This parallels the x:Class attribute value of ExampleNamespace.ExamplePage that was provided in the markup root. O compilador de marcação WPF criará uma classe parcial para qualquer arquivo compilado do XAML, derivando uma classe de tipo de elemento raiz. When you provide code-behind that also defines the same partial class, the resulting code is combined within the same namespace and class of the compiled application.
Para obter mais informações sobre os requisitos para a programação de code-behind no WPF, consulte o "Code-behind, o manipulador de eventos e os requisitos de classe parcial" seção de Code-Behind e XAML no WPF.
Se não desejar criar um arquivo code-behind separada, você também pode in-line seu código em um arquivo XAML. However, inline code is a less versatile technique that has substantial limitations. For details, see Code-Behind e XAML no WPF.
Routed Events
Um recurso de determinado evento, é fundamental para WPF é um roteados eventos. Roteadas eventos ativar um elemento para manipular um evento que foi gerado por um elemento diferente, como os elementos são conectados por meio de uma relação de árvore. Ao especificar com um atributo XAML de manipulação de eventos, o evento roteado pode ser ouvido para e manipulado em qualquer elemento, incluindo elementos que não apresentam esse evento específico na tabela de membros de classe. This is accomplished by qualifying the event name attribute with the owning class name. For instance, the parent StackPanel in the ongoing StackPanel / Button example could register a handler for the child element button's Click event by specifying the attribute Button.Click on the StackPanel object element, with your handler name as the attribute value. Para obter mais informações sobre o trabalho de eventos como roteados, consulte Visão geral sobre eventos roteados.
XAML elementos nomeado
Por padrão, a instância do objeto criado pelo processamento de um elemento de objeto XAML em um gráfico de objeto não possui um identificador exclusivo ou referência de objeto. Por outro lado, se você chamar um construtor no código, você quase sempre usar o resultado do construtor para definir uma variável para a instância construída, para que você pode fazer referência a instância posteriormente no seu código. Para fornecer acesso padronizado para objetos criados por meio de uma definição de marcação, o XAML define o atributo X:Name. You can set the value of the x:Name attribute on any object element. In your code-behind, the identifier you choose is equivalent to an instance variable that refers to the constructed instance. Em todos os aspectos, chamado a função de elementos, como se fossem instâncias de objeto (o nome faz referência a essa instância) e seu code-behind pode fazer referência os elementos nomeados para lidar com interações de tempo de execução dentro do aplicativo. Esta conexão entre instâncias e variáveis é realizado pelo compilador de marcação XAML do WPF, e mais especificamente envolvem recursos e padrões, como InitializeComponent que não serão discutidos em detalhes neste tópico.
WPF framework-nível elementos XAML herdam um Name propriedade, que é equivalente ao XAML definido x:Name atributo. Certain other classes also provide property-level equivalents for x:Name, which is also generally defined as a Name property. Em termos gerais, se você não conseguir encontrar uma Name a propriedade da tabela de membros de seu elemento/tipo escolhido, use x:Name em vez disso. O x:Name valores fornecerá um identificador para um elemento XAML que pode ser usado em tempo de execução por subsistemas específicos ou por métodos de utilitário, como FindName.
The following example sets Name on a StackPanel element. Then, a handler on a Button within that StackPanel references the StackPanel through its instance reference buttonContainer as set by Name.
<StackPanel Name="buttonContainer">
...
<Button Click="RemoveThis">Click to remove this button</Button>
</StackPanel>
Private Sub RemoveThis(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
Dim fe As FrameworkElement = e.Source
If (buttonContainer.Children.Contains(fe)) Then
buttonContainer.Children.Remove(fe)
End If
End Sub
void RemoveThis(object sender, RoutedEventArgs e)
{
FrameworkElement fe = e.Source as FrameworkElement;
if (buttonContainer.Children.Contains(fe))
{
buttonContainer.Children.Remove(fe);
}
}
Assim como uma variável, o nome XAML para uma instância é regido por um conceito de escopo, para que os nomes podem ser aplicadas para ser exclusivo dentro de um determinado escopo previsível. A marcação primária que define uma página denota um namescope exclusivo de XAML, com o limite de namescope XAML sendo o elemento raiz dessa página. Entretanto, outras fontes de marcação podem interagir com uma página em tempo de execução, como, por exemplo, estilos ou modelos dentro de estilos, e essas fontes de marcação geralmente têm seus próprios namescopes XAML não necessariamente conectar com o namescope XAML da página. Para obter mais informações sobre x:Name e namescopes do XAML, consulte Name, x: nome de diretiva, ou Namescopes do WPF XAML.
Attached Properties and Attached Events
O XAML especifica um recurso de linguagem que permite que determinadas propriedades ou eventos a ser especificado em qualquer elemento, independentemente da existência da propriedade ou evento em definições do tipo do elemento que ela está sendo definida. The properties version of this feature is called an attached property, the events version is called an attached event. Conceitualmente, você pode pensar propriedades anexadas e eventos anexados como membros globais que podem ser definidos em qualquer instância do objeto de elemento/XAML. No entanto, esse elemento/classe ou uma infra-estrutura maior deve suportar um armazenamento de propriedade de backup para os valores anexados.
Propriedades anexadas em XAML são normalmente usadas por meio da sintaxe de atributo. Na sintaxe de atributo, você especificar uma propriedade anexada no formulário ownerType.propertyName.
Superficialmente, isso é semelhante a um uso de elemento de propriedade, mas neste caso o ownerType você especificar é sempre um tipo diferente do elemento de objeto onde a propriedade anexada está sendo definida. ownerType é o tipo que fornece os métodos do acessador são exigidos por um processador XAML para obter ou definir o valor da propriedade anexada.
The most common scenario for attached properties is to enable child elements to report a property value to their parent element.
The following example illustrates the DockPanel.Dock attached property. The DockPanel class defines the accessors for DockPanel.Dock and therefore owns the attached property. The DockPanel class also includes logic that iterates its child elements and specifically checks each element for a set value of DockPanel.Dock. If a value is found, that value is used during layout to position the child elements. Use of the DockPanel.Dock attached property and this positioning capability is in fact the motivating scenario for the DockPanel class.
<DockPanel>
<Button DockPanel.Dock="Left" Width="100" Height="20">I am on the left</Button>
<Button DockPanel.Dock="Right" Width="100" Height="20">I am on the right</Button>
</DockPanel>
Em WPF, a maioria ou todas as propriedades anexadas também são implementadas como Propriedades de dependência. For details, see Attached Properties Overview.
Eventos anexados usam um semelhante ownerType.eventName o formulário de sintaxe de atributo. Assim como os eventos não anexado, o valor do atributo para um evento anexado no XAML especifica o nome do método do manipulador que é chamado quando o evento é tratado no elemento. Usos de evento anexado no WPF XAML são menos comuns. For more information, see Visão geral sobre eventos anexados.
Tipos base e XAML
XAML subjacente do WPF e o seu namespace XAML é uma coleção de tipos que correspondem a CLR objetos além dos elementos de marcação de XAML. However, not all classes can be mapped to elements. Resumo de classes, como ButtonBase, e determinadas classes de base que não é abstrata são usados para inheritance in a CLR modelo de objetos. Classes base, inclusive abstrata, ainda são importantes para o desenvolvimento de XAML porque cada um dos elementos XAML concretos herda os membros de alguma classe base em sua hierarquia. Geralmente, esses membros incluem propriedades que podem ser definidas como atributos no elemento ou eventos que podem ser manipulados. FrameworkElementé a base de concreta UI classe de WPF com o nível de estrutura WPF. When designing UI, you will use various shape, panel, decorator, or control classes, which all derive from FrameworkElement. A related base class, FrameworkContentElement, supports document-oriented elements that work well for a flow layout presentation, using APIs that deliberately mirror the APIs in FrameworkElement. A combinação de atributos no nível do elemento e uma CLR o modelo de objeto lhe oferece um conjunto de propriedades comuns que são configuráveis no mais concretos elementos XAML, independentemente do elemento específico do XAML e seu tipo subjacente.
XAML Security
O XAML é uma linguagem de marcação que representa diretamente a execução e a instanciação do objeto. Portanto, os elementos criados no XAML tem a mesma capacidade de interagir com os recursos do sistema (rede de acesso, o sistema de arquivo e/S, por exemplo) como o equivalente gerado código faz.
WPFoferece suporte a .NET Framework 4 estrutura de segurança Code Access Security (CAS). This means that WPF content running in the internet zone has reduced execution permissions. " XAML livre" (páginas não compiladas XAML interpretada no tempo de carregamento por um visualizador XAML) e XAML browser application (XBAP) geralmente são executados nessa zona de internet e usar o mesmo conjunto de permissão. Entretanto, o XAML carregado em um aplicativo totalmente confiável tem o mesmo acesso aos recursos do sistema, como o aplicativo de hospedagem. For more information, see WPF Partial Trust Security.
Loading XAML from Code
XAML pode ser usado para definir toda a interface, mas às vezes também é apropriado definir apenas uma parte da interface do usuário em XAML. Esse recurso pode ser usado para ativar a personalização parcial, o armazenamento local de informações, usando o XAML para fornecer um objeto de negócios ou de uma variedade de cenários possíveis. The key to these scenarios is the XamlReader class and its Load method. A entrada é um arquivo XAML e a saída é um objeto que representa todos os da árvore de objetos de tempo de execução que foi criado a partir da marcação. You then can insert the object to be a property of another object that already exists in the application. Contanto que a propriedade é uma propriedade apropriada no modelo de conteúdo que tenha recursos eventual vídeo e que notificará o mecanismo de execução que foi adicionado novo conteúdo no aplicativo, você pode modificar o conteúdo de um aplicativo em execução muito facilmente pela carga em XAML. Note that this capability is generally only available in full-trust applications, because of the obvious security implications of loading files into applications as they run.
What's Next
Este tópico fornece uma introdução aos conceitos de sintaxe XAML e terminologia como ele se aplica ao WPF. Para obter mais informações sobre os termos usados aqui, consulte Sintaxe XAML em detalhes.
Se ainda não tiver feito isso, tente os exercícios no tópico tutorial Demonstra Passo a passo: Guia de Introdução do WPF. Quando você cria um aplicativo centrado em marcação descrito pelo tutorial, o exercício ajudará a reforçar a muitos dos conceitos descritos neste tópico.
WPF uses a particular application model that is based on the Application class. For details, see Visão Geral do Gerenciamento de Aplicativo.
Building a WPF Application (WPF)lhe dá mais detalhes sobre como criar aplicativos inclusive XAML da linha de comando e com Microsoft Visual Studio.
Visão geral sobre propriedades de dependência gives more information about the versatility of properties in WPF, and introduces the concept of dependency properties.
Consulte também
Conceitos
Classes de personalizadas para WPF e XAML
Visão geral sobre elementos base