C# / Windows Phone Forms [przechowywanie wartości pomiędzy stronami]

0

Witam,

Mam projekt XNA + Silverlight. Stworzyłem sobie PivotPage1 do ustawiania ustawień przyszłej aplikacji.
Póki co mam w niej button, który po kliknięciu ma zmienić mi zmienną z klasy Ustawienia.
Niestety jak wpiszę w XXX "ustawienia.zmienna1" to jest błąd, że ustawienia,zmienna1 nie jest widoczna.

Pytanie: jak zmodyfikować kod, by możliwy był swobodny dostęp do zmiennej zmienna1 obiektu ustawienia z PivotPage1, tak bym mógł ewentualnie sobie czytać i zapisywać wartości pomiędzy "formami".

PivotPage1.xaml.cs

namespace Aplikacja
{
    public partial class PivotPage1 : PhoneApplicationPage
    {
        public PivotPage1()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            XXX
        }

    }
}

MainPage.xaml.cs

namespace Aplikacja
{
    public partial class MainPage : PhoneApplicationPage
    {
        public class Ustawienia
        {
            public int zmienna1;
        }

        // Konstruktor
        public MainPage()
        {
            InitializeComponent();
            startSet();
            
        }

        private void startSet()
        {
            Ustawienia ustawienia = new Ustawienia();
            ustawienia.zmienna1 = 8;
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri("/PivotPage1.xaml", UriKind.Relative));
        }
    }
}
0

Obecnie obiekt klasy Ustawienia tworzysz tylko w startSet() i tylko tam on jest widoczny - tylko w tej metodzie. Możesz stworzyć publiczny obiekt w klasie App, będzie wspólny dla wszystkich stron aplikacji.

Nie wiem dokładnie do czego chcesz to wykorzystać, ale możliwe, że lepszym sposobem będzie wykorzystanie PhoneApplicationService. PhoneApplicationService.Current.State[] to tablica asocjacyjna, która może przechowywać dowolne dane i nie są one tracone w sytuacji, kiedy aplikacja jest zabijana z powodu przerwania zewnętrznego (aka tombstoning).

Używa się tego tak:

PhoneApplicationService.Current.State["nazwa"] = (object)SomeObject;
...
MessageBox.Show((OryginalnaKlasaSomeObject)PhoneApplicationService.Current.State["nazwa"].ToString()); // wymagane rzutowanie!
0

Spróbuję z Services, zobaczę jak wyjdzie. Dzięki serdeczne.

0
        Ustawienia ustawienia = new Ustawienia();
        List<Ustawienia> resultData = new List<Ustawienia>();
        public List<Ustawienia> resultData = new List<Ustawienia>()
        {
        // 
        };
        PhoneApplicationService.Current.State["SearchResultList"] = resultData;
        List<Ustawienia> loadedResultData = (List<Ustawienia>)PhoneApplicationService.Current.State["SearchResultList"];
        public class Ustawienia
        {
            // Zmienne aplikacji
        }

i mam:

Error 6 'Microsoft.Phone.Shell.PhoneApplicationService.Current' is a 'property' but is used like a 'type
Error 7 'Aplikacja.MainPage.resultData' is a 'field' but is used like a 'type'

A nawiązując do

Obecnie obiekt klasy Ustawienia tworzysz tylko w startSet() i tylko tam on jest widoczny - tylko w tej metodzie. Możesz stworzyć publiczny obiekt w klasie App, będzie wspólny dla wszystkich stron aplikacji.

jak stworzę go

namespace Aplikacja
{
    public partial class MainPage : PhoneApplicationPage
    {
        Ustawienia ustawienia = new Ustawienia();
        public class Ustawienia
        {

to i tak w Pivot nie mam do niej dostępu. Generalnie mogę sobie stworzyć obiekt ustawienia w Pivocie, ale zmiennych i tak tam nie widać.

Jaki jest cel: W main tworzę sobie zmienne, które mogę modyfikować w pivocie. Chodzi o to, że pivot jest taką zakładką Settings aplikacji. Wykorzystanie PhoneApplicationService jest w sumie ok, ale no mam errory i w sumie po przeczytaniu paru tutoriali i tak nie bardzo rozumiem jak mam z tego korzystać.

1
  1. Jak zrobisz coś takiego:
namespace Aplikacja
{
    public partial class MainPage : PhoneApplicationPage
    {
        Ustawienia ustawienia = new Ustawienia();
        public class Ustawienia
        {
...

To zmienna ustawienia (a w zasadzie pole) jest prywatną zmienną należącą do klasy MainPage. Żadna inna klasa (czy też: strona, bo strona jest klasą) nie ma do tego dostępu.

  1. Nie rozumiem kodu, jaki robisz w pierwszym fragmencie:
public List<Ustawienia> resultData = new List<Ustawienia>()
{
        // 
};

Co to jest i co jest wewnątrz tych klamerek?

  1. Spójrz na coś takiego, specjalnie umieszczę pełny kod klasy:
namespace PhoneApp1
{
    public class Ustawienia
    {
        public int test = 9;
    }

    public partial class MainPage : PhoneApplicationPage
    {
        private List<Ustawienia> resultData;
        
        // Constructor
        public MainPage()
        {
            InitializeComponent();

            resultData = new List<Ustawienia>();
            Ustawienia usta = new Ustawienia();
            
            
            resultData.Add(usta);

            PhoneApplicationService.Current.State["DefaultList"] = resultData;
        }

        

        private void button1_Click(object sender, RoutedEventArgs e)
        {            
            List<Ustawienia> u = (List<Ustawienia>)PhoneApplicationService.Current.State["DefaultList"]);
            MessageBox.Show(u[0].test.ToString());
            

        }
    }
}

Działa, sprawdziłem.
Dodatkowo, klasa Ustawienia nie powinna być wewnątrz klasy strony, a jedynie wewnątrz namespace, jeśli ma być wykorzystywana przez wiele klas (bo teraz, to klasa wewnętrzna), a w zasadzie najlepiej w oddzielnym pliku, tutaj jest tylko dla celów edukacyjnych.

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