Uma extensão de marcação personalizada
Vamos criar a nossa própria extensão de marcação nomeada HslColorExtension. Isso nos permitirá definir qualquer propriedade do tipo Color especificando valores de matiz, saturação e luminosidade, mas de uma forma muito mais simples do que a utilização da tag x:FactoryMethod demonstrado no Capítulo 8.
Além disso, vamos colocar essa classe em uma biblioteca separada de Classes Portátil de modo que você pode usá-lo a partir de múltiplos aplicações. Tal biblioteca pode ser encontrada com o outro código-fonte para este livro. Está em um diretório chamado Bibliotecas que é paralela aos diretórios capítulo separado. O nome deste PCL (e o namespace das classes dentro dela) é Xamarin.FormsBook.Toolkit .
Você pode usar esta biblioteca em seus próprios aplicativos, definindo uma referência a ele ou através da inclusão o projeto em sua solução de aplicação. Você pode então adicionar uma nova declaração de namespace XML nos seus Arquivos XAML para especificar esta biblioteca:
Com esse prefixo kit de ferramentas que você pode fazer referência a classe HslColorExtension da mesma maneira que você usa outras extensões de marcação XAML:
Ao contrário de outras extensões de marcação XAML mostrados até agora, este tem várias propriedades, e se você estásetando-as como argumentos com a sintaxe chave, eles devem ser separados por vírgulas.
Algo com isso seria útil? Vamos primeiro ver como criar uma biblioteca de classes que você gostaria de compartilhar entre os aplicativos:
No Visual Studio, a partir do menu arquivo, selecione Novo e Projeto. Na caixa de dialogo Novo projeto, selecione Visual C# e Mobile Apps à esquerda, e Biblioteca de classes (Xamarin.Forms portáteis) a partir da lista. Encontre um local para o projeto e de um nome. Para o PCL criado para este exemplo, o nome é Xamarin.FormsBook.Toolkit . Clique em OK. Junto com toda a sobrecarga para o projeto, o modelo cria um arquivo de código Xamarin.FormsBook.Toolkit.cs nomeados contendo uma classe chamada Xamarin.FormsBook.Toolkit. Isso não é um nome de classe válido, então basta apagar o arquivo. Em Xamarin Studio, a partir do menu arquivo, selecione Nova e Solution . Na caixa de diálogo New Solution , selecione C# e Mobile Apps à esquerda, e Biblioteca de classes (Xamarin.Forms portáteis) a partir da lista. Encontre um local para ele e de um nome ( Xamarin.FormsBook.Toolkit para este exemplo). Clique em OK. A solução template cria vários arquivos, incluindo um arquivo chamado MyPage.cs. Excluir esse arquivo. Agora você pode adicionar classes para esse projeto na forma normal: No Visual Studio, clique com o botão direito do mouse no nome do projeto, selecione Adicionar e New Item . Na caixa de diálogo Add New Item , se você está apenas criando uma classe só de código, selecione Visual C# e código à esquerda, e selecione Classe a partir da lista. Dê-lhe um nome (HslColorExtension.cs para este exemplo). Clique no botão Adicionar.
Em Xamarin Studio, no menu ferramenta para o projeto, selecione Adicionar e Novo arquivo . Na caixa de diálogo Novo arquivo, se você está apenas criando uma classe só de código, selecione Geral à esquerda e à classe vazia na lista. Dar -lhe um nome (HslColorExtension.cs para este exemplo). Clique no botão Novo. O arquivo HslColorExtension.cs (incluindo a necessária uso directivas) se parece com isso:
Observe que a classe é pública e implementa a interface ImarkupExtension, o que significa que deve incluir um método ProvideValue. Contudo, o método não faz uso do argumento IserviceProvider por completo, principalmente porque não precisa saber de qualquer outra coisa externa além de si mesma. Todas as necessidades de TI são as quatro propriedades para criar um valor Color, e se o valor A não for definido, o valor padrão de 1 (totalmente opaco) é usado. Esta é uma solução com apenas um projecto de PCL. O projeto pode ser construído para gerar um conjunto de PCL, mas não pode ser executado sem um aplicativo que usa essa montagem. Há duas maneiras de acessar essa biblioteca a partir de uma solução da aplicação:
- No projeto comum PCL na solução de aplicativo, adicione uma referência ao conjunto de PCL.
- Incluir um link para o projeto de biblioteca em sua solução de aplicação, e adicionar uma referência a esse li-projeto brary no projeto PCL comum.
A primeira opção é necessária se você tiver apenas o PCL e não o projeto com código fonte. Possivelmente você está licenciando a biblioteca e não têm acesso à fonte. Mas se você tem acesso ao projeto, normalmente é melhor para incluir um link para o projeto de biblioteca em sua solução para que você possa facilmente fazer alterações no código da biblioteca e reconstruir o projeto de biblioteca. O projeto final neste capítulo é CustomExtensionDemo, que faz uso da classe HslColorExtension na nova biblioteca. A solução CustomExtensionDemo contém um link para o projeto Xamarin.FormsBook.Toolkit PCL, e a seção Referências no projeto CustomExtensionDemo lista a montagem do Xamarin.FormsBook.Toolkit. Agora, o projeto de aplicativo está aparentemente pronto para acessar o projeto de biblioteca para usar a classe HslCol- orExtension dentro do arquivo XAML do aplicativo. Mas primeiro há um outro passo. Atualmente, uma referência para a biblioteca de XAML é insuficiente para garantir que a biblioteca seja incluída com o aplicativo. A biblioteca precisa ser acessada a partir do código real. Você pode adicionar uma simples declaração no arquivo App para fazer referência a classe HslColorExtension:
O seguinte arquivo XAML mostra a declaração de namespace XML para a biblioteca Xama-rin.FormsBook.Toolkit e três maneiras de acessar a extensão de marcação XAML usando um elemento HslColorExtension definido com a sintaxe da propriedade elemento na propriedade Color e utilizando tanto HslColorExtension e HslColorcom a sintaxe mais comum chave. Mais uma vez, observe o uso de vírgulas para separar os argumentos dentro das chaves:
Os dois últimos exemplos setam a propriedade A para 50% a transparência, para que as caixas sejam exibidas em um tom de cinza (ou não em todos), dependendo do fundo:
Dois grandes usos de extensões de marcação XAML ainda estão por vir. No Capítulo 12, você verá a classe Style, que é sem dúvida o item mais popular para a inclusão em dicionários de recurso e, Capítulo 16, você verá a extensão de marcação poderoso chamado Obrigatório .