Automatyczny zapis stanu aplikacji wpf

0

Witam, mam pytanie. Napisalem prosta aplikacje wpf - mam pare kontrolek (checkboxy, textboxy, comboboxy). Aplikacje nalezy skonfigurowac przed uzyciem - pozaznaczac, powypelniac, itd. Pomyslalem, ze meczace byloby wymagac od ludzi zeby robili to za kazdym razem, wiec dodalem obiekt reprezentujacy stan wszystkich kontrolek i buttony save/load, zeby zapisac stan aplikacji poprzez javascriptSerializer do pliku, albo wczytac z pliku i ustawic stan kontrolek zgodnie z tym.

Robienie tego recznie (czyli przypisywanie np stanAplikacji.pole1 = textBox1.Text) jest znosne poki mam malo kontrolek, ale jesli aplikacja sie rozrosnie, bedzie to meczace i pewnie latwo sie pomylic. Jest mozliwosc automatyzacji tego?

0

Nie wiem, jak jest akurat w WPF, ale w Windows Forms i w większości technologii z GUI, klasa każdej kontrolki dziedziczy po ogólnej klasie kontrolki, która nazywa się "Control" lub podobnie. Jeżeli kontrolka jest elementem, na którym można umieszczać inne kontrolki (np. panel), to można uzyskać kolekcję kontrolek umieszczonych na tym elemencie.

Procedura zapisu stanu mogłaby wyglądać mniej więcej tak:

SaveState(Control C)
{
    if (C is Panel)
    {
        foreach (Control CC in ((Panel)C).ControlCollection)
        {
            SaveState(CC);
        }
    }
    if (C is Form)
    {
        foreach (Control CC in ((Form)C).ControlCollection)
        {
            SaveState(CC);
        }
    }
    if (C is TextBox)
    {
        ZapiszTekst(C.Name, ((TextBox)C).Text);
    }
    if (C is CheckBox)
    {
        ZapiszStan(C.Name, ((CheckBox)C).IsChecked);
    }
}

Analogicznie trzeba napisać procedurę odczytu. Obie procedury należy wywoływać podając jako parametr okno, które też dziedziczy po kontrolce.

Przy takim podejściu, jak będzie się dodawać i odejmować lub zmieniać kontrolki, to nie potrzeba dotykać procedur zapisania lub odczytu. Ewentualnie przy zmianie interfejsu trzeba skasować plik, w którym jest zachowany stan i utworzyć nowy plik, żeby zawartość pasowała według kolejności zapisu i odczytu stanu kontrolek. Można przemyśleć taką postać danych w pliku, że dodanie czy usunięcie kontrolki nie spowoduje zakłócenia zapisu i odczytu stanu.

0

To zalezy jaki rodzaj danych chcesz zapisywac/odczytywac, Jesli sa to dane dotyczace samych kontrolek, np ich rozmiar, polozenie, wyglad (bo np user moze to modyfikowac), to wtedy faktycznie trzeba napisac cos podobnego do propozycji kolegi wyzej.
Natomiast, jesli chcesz zapisywac "content" kontrolki, czyli np Text dla textBoxa, IsChecked dla checkBoxa, zawartosci cellek w gridzie, itd, to najlepszym wyjsciem jest wg mnie bindowanie two-way. Jesli user cos sobie poklika na layoucie, cos powpisuje, to przy bindowaniu te zmiany sa automatycznie przeniesione na obiekty "pod spodem" i tutaj mozesz oprogramowac zapis w bardziej cywilizowany sposob (np serializacja do XMLa albo jsona i z glowy ;) )

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