Autor |
Beitrag |
erfahrener Neuling
      
Beiträge: 233
Erhaltene Danke: 19
Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
|
Verfasst: 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:
danach:
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.
Einloggen, um Attachments anzusehen!
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 233
Erhaltene Danke: 19
Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
|
Verfasst: 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
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 03.06.16 11:23
Bloß nicht Application.DoEvents benutzen: Warum DoEvents Mist ist!
Am besten einen Timer dafür benutzen!
|
|
erfahrener Neuling 
      
Beiträge: 233
Erhaltene Danke: 19
Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
|
Verfasst: Fr 03.06.16 11:30
Th69 hat folgendes geschrieben : | 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
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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 
      
Beiträge: 233
Erhaltene Danke: 19
Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
|
Verfasst: 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
|
|