WPF - Zmiana UserControl w okienku

0

Co się dzieje w przypadku gdy zmieniam UserControl? Poprzedni usercontrol się zamyka czy nadal istnieje?
Korzystam z takiego Switchera

public static class Switcher
    {
        public static MainWindow pageSwitcher;

        public static void Switch(UserControl newPage)
        {
            pageSwitcher.Navigate(newPage);
        }

    }

W MainWindow mam coś takiego

        public void Navigate(UserControl nextPage)
        {
            this.Okno.Content = nextPage;
        }

I się zastanawiam czy przy częstej zmianie okienek, aplikacja może mi zużyć całą pamięć RAM i się po prostu program wysypie. Te UserControl w trakcie przełączania powinno się jakoś usuwać czy one się automatycznie usuwają po zmianie?

0

Up

0

jeżeli wstawisz obsługę wyjątków i wyrzucisz komunikat wyjątku z parametrem .ToString() to nic się nie wysypie.....

0

Niestety nie chodziło mi o to. Przedstawie problem bardziej przejrzyście:
Mam okienko zawierające kontrolkę UserControl (x:Name="Okno") i dwie kontrolki button (button1, button2). Do tego mam utworzone dwa UserControl (UserControl1, UserControl2).
Przy kilknięciu na button1 wywołuję metodę

Switcher.Switch(UserControl1); // Co powoduje ?utworzenie? nowego usercontrol i załadowanie go do kontrolki "Okno";

przy kliknięciu na button2 wywołuję metodę

Switcher.Switch(UserControl2); // Co powoduje ?utworzenie? nowego usercontrol i załadowanie go do kontrolki "Okno";

Więc moje pytanie brzmi co się stanie z poprzednim UserControl po załadowaniu nowego, zostanie on usunięty czy może jednak zajmuje on jakąś część pamięci nie podczepioną aktualnie do niczego?
Bo przy klikaniu non stop przycisków na zmianę miałbym:

pageSwitcher.Navigate(this.Okno.Contenet = new UserControl1());
pageSwitcher.Navigate(this.Okno.Contenet = new UserControl2());
pageSwitcher.Navigate(this.Okno.Contenet = new UserControl1());
pageSwitcher.Navigate(this.Okno.Contenet = new UserControl2());
pageSwitcher.Navigate(this.Okno.Contenet = new UserControl1());
...
1
Pawlak007 napisał(a):

Niestety nie chodziło mi o to.

Domyślam się. Autor tego postu nie napisał chyba jeszcze nic sensownego na forum.

Więc moje pytanie brzmi co się stanie z poprzednim UserControl po załadowaniu nowego, zostanie on usunięty czy może jednak zajmuje on jakąś część pamięci nie podczepioną aktualnie do niczego?
Bo przy klikaniu non stop przycisków na zmianę miałbym:

pageSwitcher.Navigate(this.Okno.Contenet = new UserControl1());
pageSwitcher.Navigate(this.Okno.Contenet = new UserControl2());
pageSwitcher.Navigate(this.Okno.Contenet = new UserControl1());
pageSwitcher.Navigate(this.Okno.Contenet = new UserControl2());
pageSwitcher.Navigate(this.Okno.Contenet = new UserControl1());
...

Poprzedni obiekt zostanie najprawdopodobniej usunięty automatycznie po jakimś czasie dzięki mechanizmowi Garbage Collector, który w .NET odpowiada za usuwanie niepotrzebnych obiektów i sprzątanie pamięci. To, czy zostanie usunięty zależy od tego, czy jakiś inny obiekt ma do niego referencję. Jeśli tak jest, to obiekt nie zostanie usunięty, i jeśli będziesz tworzył ich dużo, to może nastąpić wyciek pamięci, którego się obawiasz.
W przypadku WPF źródłem takich wycieków pamięci są np. zdarzenia. Jeśli obiekt jest przypięty do jakiegoś zdarzenia, i nie zostanie z niego wyrejestrowany, to nie zostanie też usunięty przez Garbage Collector.
Jak sobie z tym radzić możesz przeczytać tutaj: http://www.pzielinski.com/?p=1215

0

Wielkie dzięki. Tak myślałem ale wolałem jednak zapytać :) Kto pyta nie błądzi :)

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