public PitanjeView(string nazivGraneNavigacija) { // Instanciranje klase zajednicki elementi aplikacije koja sadrži unificirani gumb var zajednickiElementi = new ZajednickiElementiAplikacije(); // Veza sa view modelom koji je potereban jer view model odrađuje poslovnu logiku aplikacije BindingContext = new PitanjeViewModel(nazivGraneNavigacija); // Naziv stranice koji se prikazuje u navigacijskom elenentu stranice. // Naziv dolazi vezan za command property guba sa prijašnjeg view-a u ovom slučaju temaView Title = nazivGraneNavigacija; var item = new ToolbarItem { Text = "Napredak", }; this.ToolbarItems.Add(item); item.SetBinding(ToolbarItem.CommandProperty, nameof(PitanjeViewModel.NapredakCommand)); // Kolekcija koja može biti i samo label jer sadrži vrijednost string pitanja koje se postavlja korsniku // Vezan je za ViewModel vrijednost pitanje kolekcija koji sadrži string i koji se vraća u view za prikaz korisniku var collectionViewPitanje = new CollectionView { ItemTemplate = new LablePitanjeTemplate() }; collectionViewPitanje.SetBinding(ItemsView.ItemsSourceProperty, nameof(PitanjeViewModel.PitanjeCollection)); // Entry polje (bolje poznato kao input korisnik unosi vrijednost riješenja formule koju je napravio na "papiru" // Entry je vezan za property OdgovorKorisnika u ViewModelu koji se ažurira u stvarno vremenu automatski // Entry polje se ne prikazuje priliku instanciranja Pregleda, postaje vidljivo tek kad se generira prvo pitanje var unosOdgovora = new Entry { Placeholder = "Unesi odgovor", BackgroundColor = Color.White, Margin = new Thickness(20, 10), Keyboard = Keyboard.Numeric }; unosOdgovora.SetBinding(Entry.TextProperty, nameof(PitanjeViewModel.OdgovorKorisnika)); unosOdgovora.SetBinding(IsVisibleProperty, nameof(PitanjeViewModel.IsVisible)); var collectionViewMjernaJedinica = new CollectionView { ItemTemplate = new LableMjernaJedinicaTemplate() }; collectionViewMjernaJedinica.SetBinding(ItemsView.ItemsSourceProperty, nameof(PitanjeViewModel.MjernaJedinicaOdgovoraCollection)); var obavjestNakonOdgovora = new CollectionView { ItemTemplate = new LableObavjestOdgvorTemplate() }; obavjestNakonOdgovora.SetBinding(ItemsView.ItemsSourceProperty, nameof(PitanjeViewModel.ObavijestKorisnikuCollection)); var collectionViewOdgovor = new CollectionView { ItemTemplate = new LableOdgovorTemplate() }; collectionViewOdgovor.SetBinding(ItemsView.ItemsSourceProperty, nameof(PitanjeViewModel.OdgovorCollection)); // Button za generiranje novog pitanja // Vezano je na ViewModel na ICommand GenerirajPitanjeCommand // Pošto je to button koji korisiti primarne boje instancira se iz zajedničkih elemenata // Sam gumb je preopterečena metoda za izradu novog gumba jer naziv gumba i commandProperty nisu ista vrijednost var generirajPitanjeButton = zajednickiElementi.OtherButton(novoPitanje, nazivGraneNavigacija); generirajPitanjeButton.SetBinding(Button.CommandProperty, nameof(PitanjeViewModel.GenerirajPitanjeCommand)); // Button koji će prikazati korisniku odogovor nakon što je unešeno riješenje i provjereno // Pošto je to jedini gumb ovih vrijednosti onda ga ne generiramo iz zajedničkih elelemnata // Ali pošto koristi boje aplikacije da bi se održala uniformiranost boju vuče iz zajedničkih elemenata // Gumb nije vidljiv dok se ne unese riješenje var prikaziOdgovorButton = zajednickiElementi.OtherButton(prikaziRiješenjeButton, prikaziRješenjeNaziv); prikaziOdgovorButton.BackgroundColor = zajednickiElementi.NavigacijaDrugaBoja; prikaziOdgovorButton.SetBinding(Button.CommandProperty, nameof(PitanjeViewModel.PrikaziOdgovorCommand)); prikaziOdgovorButton.SetBinding(IsEnabledProperty, nameof(PitanjeViewModel.IsEnabledRiješenje)); // Gumb koji korsnik uspoređuje svoje rješenje jednadžbe s rješenjem aplikacije var provjeriOdgovorButton = zajednickiElementi.OtherButton("Provjeri rješenje"); provjeriOdgovorButton.BackgroundColor = zajednickiElementi.BackColorGreen; provjeriOdgovorButton.SetBinding(Button.CommandProperty, nameof(PitanjeViewModel.ProvjeriOdgovorCommand)); provjeriOdgovorButton.SetBinding(IsEnabledProperty, nameof(PitanjeViewModel.IsEnabledProvjeriOdgovor)); // Generiranje mreže koja će držati elemente aplikacije u pregledu za korisnika // Mreža ima dvije kolone i 4 reda var grid = new Grid { Margin = new Thickness(10, 10), ColumnDefinitions = { new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }, new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) } }, RowDefinitions = { new RowDefinition { Height = new GridLength(0.5, GridUnitType.Star) }, new RowDefinition { Height = new GridLength(0.5, GridUnitType.Auto) }, new RowDefinition { Height = new GridLength(90, GridUnitType.Absolute) }, new RowDefinition { Height = new GridLength(90, GridUnitType.Absolute) }, new RowDefinition { Height = new GridLength(70, GridUnitType.Absolute) }, new RowDefinition { Height = new GridLength(70, GridUnitType.Absolute) } } }; // Dodavanje elementa na sam pregled neki elementi se protežu preko cijelog reda dok drugi zauzimaju jednu od kolona grid.Children.Add(collectionViewPitanje, 0, 0); Grid.SetColumnSpan(collectionViewPitanje, 2); //grid.Children.Add(collectionViewOdgovor, 0, 1); grid.Children.Add(unosOdgovora, 0, 1); Grid.SetColumnSpan(unosOdgovora, 2); grid.Children.Add(collectionViewMjernaJedinica, 0, 2); Grid.SetColumnSpan(collectionViewMjernaJedinica, 2); grid.Children.Add(obavjestNakonOdgovora, 0, 3); Grid.SetColumnSpan(obavjestNakonOdgovora, 2); grid.Children.Add(prikaziOdgovorButton, 0, 4); Grid.SetColumnSpan(prikaziOdgovorButton, 1); grid.Children.Add(provjeriOdgovorButton, 1, 4); Grid.SetColumnSpan(provjeriOdgovorButton, 1); grid.Children.Add(generirajPitanjeButton, 0, 5); Grid.SetColumnSpan(generirajPitanjeButton, 2); Content = grid; }
public NapredakView(string grana) { BindingContext = new NapredakViewModel(grana); Title = $"{grana} napredak"; var razina = new Label { TextColor = Color.DarkOrange, FontSize = 50, HorizontalTextAlignment = TextAlignment.Center, Margin = new Thickness(0, 0, 0, 50) }; razina.SetBinding(Label.TextProperty, nameof(NapredakViewModel.Razina)); var ukupnoPitanja = new Label { TextColor = Color.DarkSlateGray, FontSize = 30, HorizontalTextAlignment = TextAlignment.Center, Margin = new Thickness(0, 0, 0, 50) }; ukupnoPitanja.SetBinding(Label.TextProperty, nameof(NapredakViewModel.Ukupno)); var postotak = new Label { TextColor = Color.DarkSlateGray, FontSize = 30, HorizontalTextAlignment = TextAlignment.Center, Margin = new Thickness(0, 0, 0, 50) }; postotak.SetBinding(Label.TextProperty, nameof(NapredakViewModel.Postotak)); var razina2 = new Label { Text = "Razina 2 min 10 odgovora i postotak > 60%", TextColor = Color.DarkSlateGray, }; var razina3 = new Label { Text = "Razina 3 min 20 odgovora na razini 2 i postotak > 60%", TextColor = Color.DarkSlateGray, }; var nazad = zajednickiElementi.OtherButton("Nazad"); nazad.HeightRequest = 70; nazad.SetBinding(Button.CommandProperty, nameof(NapredakViewModel.NazadCommand)); var stack = new StackLayout { Children = { razina, ukupnoPitanja, postotak, razina2, razina3, }, VerticalOptions = LayoutOptions.Center }; var grid = new Grid { Margin = new Thickness(10, 10), ColumnDefinitions = { new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }, }, RowDefinitions = { new RowDefinition { Height = new GridLength(0.5, GridUnitType.Star) }, new RowDefinition { Height = new GridLength(70, GridUnitType.Absolute) } } }; grid.Children.Add(stack, 0, 0); grid.Children.Add(nazad, 0, 1); Content = grid; }