Entwickler-Ecke

WinForms - Control beim 'Ausfahren' grau


erfahrener Neuling - Fr 03.06.16 08:59
Titel: Control beim 'Ausfahren' grau
Hallo,

ich habe ein Panel mit einer Groupbox drauf. Wenn ich eine CheckBox aktiviere, ändert sich die Panel-Height schrittweise von 0 auf 200 (es fährt sich sozusagen aus). Nur ist die Groupbox beim Ausfahren ziemlich grau und flackert leicht.

beim Ausfahren:
pic1

danach:
pic2

Die Panel Struktur sieht so aus:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
|------------------------------------|
|   TopPanel; Dock=Top               |
|------------------------------------|
| FilterPanel(das Problem); Dock=Top |
|------------------------------------|
| ListViewPanel; Dock=Fill           |
|                                    |
|                                    |
|                                    |
|                                    |
|------------------------------------|


Als ich es noch nicht mit dem autom. Anpassen des ListViewPanel per Fill-Dock, sah es besser aus, aber es gab Probleme mit der Größenanpassung.

Also Frage: Wie kann ich diese Graufärbung der Groupbox während des Ausfahrens vermeiden? Gibt es vielleicht Methoden/Controls, mit dem man dass besser lösen könnte?

Gruß Julian
dankbar für jede Hilfe.


jaenicke - Fr 03.06.16 09:26

Das sieht so aus als ob das einfach nicht neu gezeichnet wird. Dafür kannst du beim Ausfahren Application.DoEvents aufrufen.

Generell wichtig bei so etwas ist, nicht fest pixelweise zu animieren, sondern zeitbasiert. Sprich wenn es auch einem PC länger dauert, überspringt man ein paar Pixel. Das geht, wenn man die Pixelposition basierend auf der abgelaufenen Zeit berechnet.

Und dann gibt es da noch AnimateWindow [https://msdn.microsoft.com/de-de/library/windows/desktop/ms632669(v=vs.85).aspx]. Damit sollte die Animation schöner aussehen.

Und direkt für C# gibts noch eine Bibliothek dafür:
https://falahati.github.io/WinFormAnimation/


erfahrener Neuling - Fr 03.06.16 09:28

Danke richtige Antwort ;) Nach so einer Methode hab ich eh schon für 'zig andere Sachen gesucht

PS: ja mit der Zeit stimmt schon, hatte da an ein Timer-Tick-Event gedacht, da die Geschwindigkeit per Schleife ja ziemlich Random ist.
PPS: Danke die Library werd ich mir mal im Hinterkopf behalten. Hab nur momentan keine Zeit dafür ;)


Palladin007 - Fr 03.06.16 09:46

Zitat:
PS: ja mit der Zeit stimmt schon, hatte da an ein Timer-Tick-Event gedacht, da die Geschwindigkeit per Schleife ja ziemlich Random ist.


Und den UI-Thread für die komplette Animation blockiert ;)


Th69 - Fr 03.06.16 10:23

Bloß nicht Application.DoEvents benutzen: Warum DoEvents Mist ist! [http://www.mycsharp.de/wbb2/thread.php?threadid=99951]
Am besten einen Timer dafür benutzen!


erfahrener Neuling - Fr 03.06.16 10:30

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Bloß nicht Application.DoEvents benutzen

Was kann denn passieren, wenn ich das bloß in einem Event habe, um die Groupbox neu zu zeichen?

Zitat:
Am besten einen Timer dafür benutzen!

Ja das wollt ich auch machen.


Th69 - Fr 03.06.16 11:04

Das generelle Problem dabei ist, daß während ein Ereignis ausgeführt wird mittels Application.DoEvents weitere Ereignisse (evtl. rekursiv) aufgerufen werden.
Und in dem Link von mir wird noch auf einen Fall verwiesen, wenn man währenddessen dann das Programms schließt (was ja dann durch Application.DoEvents ausgeführt wird), danach dann evtl. auf schon freigegebene Controls weiter zugegriffen wird...


erfahrener Neuling - Fr 03.06.16 11:28

Habe das Problem jetzt anders gelöst, unzwar ganz einfach: this.groupBoxFilter.Refresh() Jetzt muss ich nur noch an der Geschwindigkeit rumbasteln, dann passt's