Autor Beitrag
erfahrener Neuling
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 233
Erhaltene Danke: 19

Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
BeitragVerfasst: Fr 03.06.16 09:59 
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:
ausblenden 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.
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 03.06.16 10: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. Damit sollte die Animation schöner aussehen.

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


Zuletzt bearbeitet von jaenicke am Fr 03.06.16 10:30, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: erfahrener Neuling
erfahrener Neuling Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 233
Erhaltene Danke: 19

Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
BeitragVerfasst: Fr 03.06.16 10: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Fr 03.06.16 10: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 03.06.16 11:23 
Bloß nicht Application.DoEvents benutzen: Warum DoEvents Mist ist!
Am besten einen Timer dafür benutzen!
erfahrener Neuling Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 233
Erhaltene Danke: 19

Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
BeitragVerfasst: Fr 03.06.16 11: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 03.06.16 12: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...

Für diesen Beitrag haben gedankt: erfahrener Neuling
erfahrener Neuling Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 233
Erhaltene Danke: 19

Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
BeitragVerfasst: Fr 03.06.16 12: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