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 sem parâmetros público; O objeto resultante é inicializado por meio das 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 marcas de elemento indicando 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 é chamado para criar um objeto. Esse método de fábrica deve ser público e estático, e deve criar um objeto do tipo em que está 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 factory são especificados dentro x:Arguments de 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 fazer referência 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 da marcação em XAML. Uma técnica comum é criar uma nova classe baseada em XAML que deriva do 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 ColorViewListPage classe deriva de ContentPage como de costume e cria explicitamente 17 instâncias de ColorView.

O acesso à 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 de usuário do teclado em XAML e como implementar os Clicked manipuladores no arquivo code-behind.

Gestos de toque

Qualquer View objeto pode obter entrada por 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.)