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