WPF - Zmiana UserControl w okienku

WPF - Zmiana UserControl w okienku
P0
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 lat
  • Postów:57
0

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

Kopiuj
public static class Switcher
    {
        public static MainWindow pageSwitcher;

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

    }

W MainWindow mam coś takiego

Kopiuj
        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?

P0
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 lat
  • Postów:57
0

Up

PI
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 6 lat
  • Postów:61
0

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

edytowany 2x, ostatnio: pixelplus
somekind
Ty wiesz w ogóle o czym piszesz?
P0
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 lat
  • Postów:57
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ę

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

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

Kopiuj
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:

Kopiuj
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());
...
edytowany 1x, ostatnio: Pawlak007
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około godziny
  • Lokalizacja:Wrocław
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:

Kopiuj
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

edytowany 1x, ostatnio: somekind
P0
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 lat
  • Postów:57
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.