Partilhar via


Resumo do Capítulo 8. Código e XAML em harmonia

Observação

Este livro foi publicado na primavera de 2016 e não foi atualizado desde então. Há muito no livro que permanece valioso, mas parte do material está desatualizado e alguns tópicos não estão mais totalmente corretos ou completos.

Este capítulo explora o XAML mais profundamente e, particularmente, como o código e o XAML interagem.

Passar argumentos

No caso geral, uma classe instanciada em XAML deve ter um construtor público sem parâmetros; O objeto resultante é inicializado por meio de configurações de propriedade. No entanto, há duas outras maneiras pelas quais os objetos podem ser instanciados e inicializados.

Embora essas sejam técnicas de uso geral, elas são usadas principalmente em conexão com modelos de exibição MVVM.

Construtores com argumentos

O exemplo ParameteredConstructorDemo demonstra como usar a marca para especificar argumentos do x:Arguments construtor. Esses argumentos devem ser delimitados por tags de elemento que indicam o tipo do argumento. Para os tipos de dados básicos do .NET, as seguintes marcas estão disponíveis:

  • x:Object
  • x:Boolean
  • x:Byte
  • x:Int16
  • x:Int32
  • x:Int64
  • x:Single
  • x:Double
  • x:Decimal
  • x:Char
  • x:String
  • x:TimeSpan
  • x:Array
  • x:DateTime

Posso chamar métodos de XAML?

O exemplo FactoryMethodDemo demonstra como usar o x:FactoryMethod elemento para especificar um método de fábrica que é invocado para criar um objeto. Esse método de fábrica deve ser público e estático e deve criar um objeto do tipo no qual ele é definido. (Por exemplo, o Color.FromRgb método se qualifica porque é público e estático e retorna um valor do tipo Color.) Os argumentos para o método de fábrica são especificados em x:Arguments tags.

O atributo x:Name

O x:Name atributo permite que um objeto instanciado em XAML receba um nome. As regras para esses nomes são as mesmas que para nomes de variáveis C#. Após o InitializeComponent retorno da chamada no construtor, o arquivo code-behind pode se referir a esses nomes para acessar o elemento XAML correspondente. Os nomes são realmente convertidos pelo analisador XAML em campos privados na classe parcial gerada.

O exemplo XamlClock demonstra o uso de x:Name para permitir que o arquivo code-behind mantenha dois Label elementos definidos em XAML atualizados com a data e hora atuais.

O mesmo nome não pode ser usado para vários elementos na mesma página. Esse é um problema específico se você usar OnPlatform para criar objetos nomeados paralelos para cada plataforma. O exemplo PlatformSpecificLabele demonstra uma maneira melhor de fazer algo assim.

Exibições personalizadas baseadas em XAML

Há várias maneiras de evitar a repetição de marcação em XAML. Uma técnica comum é criar uma nova classe baseada em XAML que deriva de ContentView. Essa técnica é demonstrada no exemplo ColorViewList . A ColorView classe deriva de ContentView para exibir uma cor específica e seu nome, enquanto a classe deriva ColorViewListPage de ContentPage como de costume e cria explicitamente 17 instâncias de ColorView.

Acessar a ColorView classe em XAML requer outra declaração de namespace XML, comumente nomeada local para classes no mesmo assembly.

Eventos e manipuladores

Os eventos podem ser atribuídos a manipuladores de eventos em XAML, mas o próprio manipulador de eventos deve ser implementado no arquivo code-behind. O XamlKeypad demonstra como criar uma interface do usuário de teclado em XAML e como implementar os Clicked manipuladores no arquivo code-behind.

Gestos de toque

Qualquer View objeto pode obter entrada de toque e gerar eventos a partir dessa entrada. A View classe define uma GestureRecognizers propriedade de coleção que pode conter uma ou mais instâncias de classes derivadas de GestureRecognizer.

O TapGestureRecognizer gera Tapped eventos. O programa MonkeyTap demonstra como anexar TapGestureRecognizer objetos a quatro BoxView elementos para criar um jogo de imitação:

Captura de tela tripla do toque do macaco

Mas o programa MonkeyTap realmente precisa de som. (Veja o próximo capítulo.)