1
resposta

TabbedPage usando Forms Xaml Page

Olá. Gostaria de saber como ficaria a HomeView usando Forms Xaml Page (lembrando que na vídeo aula foi feito em Forms Page).

using Refeicao.Data;
using SQLite;
using Xamarin.Forms;

namespace Refeicao.View
{
    public class HomeView : TabbedPage
    { 
        public HomeView()
        {
            SQLiteConnection sqLiteConnection = DependencyService.Get<ISqLite>().Connection();
            RefeicaoDAO refeicaoDao = new RefeicaoDAO(sqLiteConnection);

            CadastroView cadastroView = new CadastroView(refeicaoDao);
            ListaRefeicaoView listaRefeicaoView = new ListaRefeicaoView(refeicaoDao);
            this.Children.Add(cadastroView);
            this.Children.Add(listaRefeicaoView);
        }
    }
}

Como ficaria esse código em Xaml?

1 resposta

Oi Luis!

Atendendo seu pedido, não foi fácil, mas consegui fazer funcionar em XAML.

Geralmente o desenvolvimento em XAML é mais simples, mas esse caso é uma exceção, porque as views possuem parâmetros, e o XAML é meio desajeitado para trabalhar com parâmetros. Outro problema também é que tive que criar construtores alternativos para algumas classes pois a instância do SQLiteConnection criada com o DependencyService via código não pode ser criada pelo XAML (eu pelo menos desconheço, seria preciso investigar melhor).

Se você quiser fazer funcionar, vou colocar aqui os passos que eu dei para chegar até o projeto funcionando:

  • Faça uma cópia do seu projeto para outra pasta, pois as mudanças são muito bruscas. Provavelmente você vai querer voltar ao projeto inicial.

  • Na classe RefeicaoDAO, crie um construtor sem parâmetros, e dentro dele atribua ao membro conexao uma instância gerada via DependencyService:

        public RefeicaoDAO()
        {
            conexao = DependencyService.Get<ISQLite>().GetConnection();
            conexao.CreateTable<Refeicao>();
        }
  • Ainda na classe RefeicaoDAO, referencie a propriedade Lista nesses dois métodos com a letra maiúscula (a propriedade pública):
        public void Salvar(Refeicao refeicao)
        {
            conexao.Insert(refeicao);
            Lista.Add(refeicao);
        }

        public void Remove(Refeicao refeicao)
        {
            conexao.Delete<Refeicao>(refeicao.ID);
            Lista.Remove(refeicao);
        }
  • Renomeie seu arquivo Homeview.cs para Homeview.xaml.cs

  • No seu arquivo HomeView.xaml.cs, comente o código dentro do construtor e acrescente a chamada para o método InitializeComponent:

namespace Refeicao.View
{
    public partial class HomeView : TabbedPage
    {
        public HomeView()
        {
            InitializeComponent();
            //SQLiteConnection sqLiteConnection = DependencyService.Get<ISQLite>().GetConnection();
            //RefeicaoDAO dao = new RefeicaoDAO(sqLiteConnection);

            //CadastroView cadastroView  = new CadastroView(dao);
            //ListaRefeicaoView listaRefeicaoView = new ListaRefeicaoView(dao);
            //this.Children.Add(cadastroView);
            //this.Children.Add(listaRefeicaoView);
        }
    }
}
  • Crie um novo arquivo HomeView.xaml e acrescente este conteúdo:
<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:views="clr-namespace:Refeicao.View"
             xmlns:data="clr-namespace:AluraNutricao.Data"
             x:Class="Refeicao.View.HomeView"
             Title="Home View">
    <TabbedPage.Resources>
        <ResourceDictionary>
            <data:RefeicaoDAO x:Key="refeicaoDao"/>
        </ResourceDictionary>
    </TabbedPage.Resources>
    <TabbedPage.Children>
        <views:CadastroView x:Key="cadastroView">
            <x:Arguments>
                <data:RefeicaoDAO x:Key="refeicaoDao"/>
            </x:Arguments>
        </views:CadastroView>
        <views:ListaRefeicaoView x:Key="listaRefeicaoView">
            <x:Arguments>
                <data:RefeicaoDAO x:Key="refeicaoDao"/>
            </x:Arguments>
        </views:ListaRefeicaoView>
    </TabbedPage.Children>
</TabbedPage>

Note no código acima o uso do atributo x:Arguments para passar parâmetros para os construtores das views de cadastro e de listagem de refeições!

  • Modifique as propriedades do arquivo HomeView.xaml no painel de propriedades:

  • Build Action: Embedded Resource

É isso!

Se você quiser experimentar essas mudanças no seu código, lembre-se primeiro de fazer um backup do seu código.

Boa sorte e bons estudos!