2010-02-26 9 views
10

Obecnie pracuję nad programem, który wykorzystuje dość złożoną strukturę zagnieżdżonych formantów WinForm, które zmieniają się dynamicznie, gdy użytkownik dokonuje pewnych wyborów. Bardziej szczegółowe informacje na temat konkretnego układu kontrolek byłyby obszerne w przypadku tego pytania.Jak naprawić zagnieżdżone problemy z migotaniem kontrolek WinForm

Podczas dokonywania selekcji wiele aktualizacji jest wprowadzanych do modelu podstawowego, który jest kontrolowany przez formanty użytkownika. Powoduje to szereg odpowiednich zmian w rozmiarze/pozycji/widoczności wyświetlanych elementów sterujących. Wszystkie te zmiany powodują bardzo intensywne migotanie kontrolek na ekranie. Muszę jakoś to naprawić, aby za każdym razem, gdy użytkownik dokonał wyboru, ekran jest zasadniczo zamrożony, dopóki wszystkie aktualizacje kontrolne nie zostaną zakończone.

Próbowałem używać metod Control.SuspendLayout/Control.ResumeLayout w wielu różnych miejscach i sposobach i nie mogę wyeliminować szalonego migotania. Myślałem, że zawieszenie układu na kontrolerze root podczas zmian naprawiłoby problem, ale wydaje się, że ten SuspendLayout nie pomaga, gdy zmienione są formanty podrzędne.

Czy muszę stosować inne podejście niż SuspendLayout? Czy istnieje sposób, w jaki mogę debugować SuspendLayout, aby zobaczyć, dlaczego nie wygląda na kaskadę wszystkich kontrolek podrzędnych?

+0

Ta odpowiedź zadziałała dla mnie http://stackoverflow.com/questions/487661/how-do-i-suspend-painting-for-a- control-and-its-children – wal

Odpowiedz

2

Oprócz sugestii @ tommieb75 do podwójnego buforowania, możesz spróbować sprawdzić, czy kontrolki na poziomie głównym mają pary metod BeginUpdate/EndUpdate. Powinny one pomóc w represjonowaniu powtórek pomiędzy wezwaniami.

+1

Kolejna para metod, o których należy pamiętać jest 'SuspendLayout()' i 'ResumeLayout()', który wstrzyma/wznowi malowanie kontrolki – STW

0

Jeśli używasz WinForms 2+, możesz po prostu ustawić opcję "Kontrola". DoubleBuffer 'Właściwość na kontroli do wartości true (w projektancie).

W ramach 2, ustawienie DoubleBuffered ustawia 3 flagi: OptimizedDoubleBuffer, AllPaintingInWmPaint, i inne, o których zapomniałem, "UserPaint".

Zobacz także BeginUpdate/EndUpdate, jak wspomniano w @yetapb.

14

Zawieszenie/ResumeLayout nie jest tutaj problemem. To tylko wstrzymuje automatyczny układ, który jest uruchamiany przez właściwości Anchor i Dock. Podwójne buforowanie nie może również rozwiązać problemu, który tylko tłumi migotanie w poszczególnych kontrolkach. Twoim prawdziwym problemem jest to, że aktualizujesz zbyt wiele kontrolek w tym samym czasie, a każda z nich sama zajmie się malowaniem, a to wymaga czasu.

Potrzebny jest inny rodzaj podwójnego buforowania, kompozycja. Sprawdź, czy rozwiązanie w numerze this thread rozwiązuje problem.

+1

Yay, dodatkowy sposób :) Mam nadzieję, że pamiętam, kiedy go potrzebuję. –

+0

+1 uratowałeś mój dzień (chociaż późno w nocy ...) – karlipoppins

+0

Dzięki .. zaoszczędziłem mój czas =) – Emo