Dodawanie pytań i odpowiedzi do Pinów Xamarin.forms

0

Uzywam customowej Mapy/pinow w xamarin.forms (dokladnie stąd https://docs.microsoft.com/pl-pl/xamarin/xamarin-forms/app-fundamentals/custom-renderer/map/customized-pin), poniewaz na zwyklej standardowej z xamarin.forms.maps nie ma za duzo mozliwosci
Moglby ktos pomoc w dodawaniu pytan i odpowiedzi do pinow? Nie wiem za bardzo jak się za to zabrac, tak zeby mozna bylo kliknac w pin i dostać pytanie z 4 odpowiedziami i tylko jedna z nich jest poprawna. Moj kod:

 public async void OnMapClicked(object sender, MapClickedEventArgs e)
        {
            CustomPin pin = new CustomPin
            {
                Type = PinType.SavedPin,
                Position = new Position(e.Position.Latitude, e.Position.Longitude),
                Label = nazwaEntry.Text,
                Address = opisEntry.Text,
                Name = "Xamarin",
                Url = "http://xamarin.com/about/",
                Question = zagadkaEntry.Text,
                Answer = odpowiedzEntry.Text
            };
            pin.MarkerClicked += async (s, args) =>
            {
                args.HideInfoWindow = true;
                string pinName = ((CustomPin)s).Label;
                string pytanie = ((CustomPin)s).Question;
                string odpowiedz = ((CustomPin)s).Answer;
                await DisplayAlert("Pin Clicked", $"{pinName} was clicked.", "Ok");
                string result = await DisplayPromptAsync("Zagadka", $"{pytanie}", initialValue: odpowiedz, maxLength: 2, keyboard: Keyboard.Numeric);

            };
            customMap.CustomPins = new List<CustomPin> { pin };
            customMap.Pins.Add(pin);


            var json = JsonConvert.SerializeObject(new { X =  pin.Position.Latitude, Y = pin.Position.Longitude });

            var content = new StringContent(json, Encoding.UTF8, "application/json");

            HttpClient client = new HttpClient();

            var result = await client.PostAsync("URL", content);

            if (result.StatusCode == HttpStatusCode.Created)
            {
                await DisplayAlert("Komunikat", "Dodanie puntku przebiegło pomyślnie", "Anuluj");
            }


        }
1

Ja bym zrobił to w taki sposób, że:

  • stworzyłbym jakąś klasę, która opisuje pozycję pinu, opis, pytanie, odpowiedzi, poprawną odpowiedź;
  • stworzyłbym listę obiektów tej klasy;
  • na jej podstawie generował piny w powiązaniu z obiektami klasy;
  • po kliknięciu pinu powiązany obiekt by był przekazywany do strony uruchomionej przez PushModalAsync(), w którym by się wyświetlało pytanie i odpowiedzi (jeśli jest zawsze taka sama liczba to druga strona zawsze by mogła mieć taką samą postać) i on by obsługiwał czy dobrze kliknięto, czy też źle.
0
Ktos napisał(a):

Ja bym zrobił to w taki sposób, że:

  • stworzyłbym jakąś klasę, która opisuje pozycję pinu, opis, pytanie, odpowiedzi, poprawną odpowiedź;
  • stworzyłbym listę obiektów tej klasy;
  • na jej podstawie generował piny w powiązaniu z obiektami klasy;
  • po kliknięciu pinu powiązany obiekt by był przekazywany do strony uruchomionej przez PushModalAsync(), w którym by się wyświetlało pytanie i odpowiedzi (jeśli jest zawsze taka sama liczba to druga strona zawsze by mogła mieć taką samą postać) i on by obsługiwał czy dobrze kliknięto, czy też źle.

mógłbyś objaśnić ten ostatni punkt jak by to miało mniej więcej wyglądać?

1

Coś w tym stylu:

strona QuestionPage.xaml:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="App3.QuestionPage">

    <StackLayout>
        <ListView ItemsSource="{Binding Answers}" ItemTapped="ListView_ItemTapped">
        </ListView>
    </StackLayout>
</ContentPage>

klasa QuestionPage:

public partial class QuestionPage : ContentPage
{
    private Question question;

    public bool Result { get; set; }

    public QuestionPage(Question question)
    {
        InitializeComponent();
        BindingContext = question;
        this.question = question;

        Result = false;
    }

    private void ListView_ItemTapped(object sender, ItemTappedEventArgs e)
    {
        if (e.ItemIndex == question.GoodAnswer)
        {
            Result = true;
        }

        Navigation.PopModalAsync();
    }
}

Klasa Question:

public class Question
{
    public List<string> Answers { get; set; }
    public int GoodAnswer { get; set; }
    public string Text { get; set; }
}

Użycie (jako obsługa kliknięcia przycisku):

private async void Button_Clicked(object sender, EventArgs e)
{
    var question = new Question { Answers = new List<string> { "Tak", "Nie", "Może", "Lubię placki" }, GoodAnswer = 0, Text = "Czy kot ma ogon?" };
    var questionPage = new QuestionPage(question);
    questionPage.Disappearing += QuestionPageClosed;

    await Navigation.PushModalAsync(questionPage);
}

private async void QuestionPageClosed(object sender, EventArgs e)
{
    var questionPage = sender as QuestionPage;
    await DisplayAlert("", "Człowiek odpowiedział: " + (questionPage.Result ? "dobrze" : "źle"), "OK");
}
0
Ktos napisał(a):

Coś w tym stylu:

strona QuestionPage.xaml:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="App3.QuestionPage">

    <StackLayout>
        <ListView ItemsSource="{Binding Answers}" ItemTapped="ListView_ItemTapped">
        </ListView>
    </StackLayout>
</ContentPage>

klasa QuestionPage:

public partial class QuestionPage : ContentPage
{
    private Question question;

    public bool Result { get; set; }

    public QuestionPage(Question question)
    {
        InitializeComponent();
        BindingContext = question;
        this.question = question;

        Result = false;
    }

    private void ListView_ItemTapped(object sender, ItemTappedEventArgs e)
    {
        if (e.ItemIndex == question.GoodAnswer)
        {
            Result = true;
        }

        Navigation.PopModalAsync();
    }
}

Klasa Question:

public class Question
{
    public List<string> Answers { get; set; }
    public int GoodAnswer { get; set; }
    public string Text { get; set; }
}

Użycie (jako obsługa kliknięcia przycisku):

private async void Button_Clicked(object sender, EventArgs e)
{
    var question = new Question { Answers = new List<string> { "Tak", "Nie", "Może", "Lubię placki" }, GoodAnswer = 0, Text = "Czy kot ma ogon?" };
    var questionPage = new QuestionPage(question);
    questionPage.Disappearing += QuestionPageClosed;

    await Navigation.PushModalAsync(questionPage);
}

private async void QuestionPageClosed(object sender, EventArgs e)
{
    var questionPage = sender as QuestionPage;
    await DisplayAlert("", "Człowiek odpowiedział: " + (questionPage.Result ? "dobrze" : "źle"), "OK");
}

A jakbym powiedzmy zrobil tak:

public class Question
{
    public string Answers1 { get; set; }
    public string Answers2 { get; set; }
    public string Answers3 { get; set; }
    public string Answers4 { get; set; }
    public int GoodAnswer { get; set; }
    public string Text { get; set; }
}

To jak przerobić ten kod:

var question = new Question { Answers = new List<string> { "Tak", "Nie", "Może", "Lubię placki" }, GoodAnswer = 0, Text = "Czy kot ma ogon?" };

żeby po wcisnięciu buttonu wyswietlały się odpowiedzi jeden pod drugim?

1

Jeżeli chcesz to zrobić, aby były cztery właściwości od odpowiedzi a nie lista, to też się da, ale to będzie znacznie więcej roboty, bo ani nie możesz użyć ListView, ani nie możesz użyć prostego sprawdzania co kliknięto i czy to dobrze.

Więc ja bym zrobił coś takiego trochę jak jest w ActionSheet - że GoodAnswer jest stringiem i porównujesz stringa klikniętego z tym, który jest w GoodAnswer.

QuestionPage.xaml.cs:

public partial class QuestionPage : ContentPage
{
    private Question question;

    public bool Result { get; set; }

    public QuestionPage(Question question)
    {
        InitializeComponent();
        BindingContext = question;
        this.question = question;

        Result = false;
    }

    private void Button_Clicked(object sender, EventArgs e)
    {
        if ((sender as Button).Text == question.GoodAnswer)
        {
            Result = true;
        }

        Navigation.PopModalAsync();
    }
}

QuestionPage.xaml:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="App6.QuestionPage">

    <StackLayout>
        <Button Text="{Binding Answers1}" Clicked="Button_Clicked" />
        <Button Text="{Binding Answers2}" Clicked="Button_Clicked" />
        <Button Text="{Binding Answers3}" Clicked="Button_Clicked" />
        <Button Text="{Binding Answers4}" Clicked="Button_Clicked" />
    </StackLayout>
</ContentPage>

Klasa Question:

public class Question
{
    public string Answers1 { get; set; }
    public string Answers2 { get; set; }
    public string Answers3 { get; set; }
    public string Answers4 { get; set; }

    public string GoodAnswer { get; set; }
    public string Text { get; set; }
}

Przykład użycia:

private async void Button_Clicked(object sender, EventArgs e)
{
    var question = new Question { Answers1 = "Tak", Answers2 = "Nie", Answers3 = "Może", Answers4 = "Lubię placki", GoodAnswer = "Tak", Text = "Czy kot ma ogon?" };
    var questionPage = new QuestionPage(question);
    questionPage.Disappearing += QuestionPageClosed;

    await Navigation.PushModalAsync(questionPage);
}

private async void QuestionPageClosed(object sender, EventArgs e)
{
    var questionPage = sender as QuestionPage;
    await DisplayAlert("", "Człowiek odpowiedział: " + (questionPage.Result ? "dobrze" : "źle"), "OK");
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1