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:
Mas o programa MonkeyTap realmente precisa de som. (Veja o próximo capítulo.)