Hallo zusammen,
nachdem ich nun seit ca. 6 Stunden vergeblich versucht habe das Problem zu lösen, möchte ich mein Problem einmal hier schildern.
Die Anforderung:
Nach einem Klick in eine Listbox soll eine PictureBox einem bestehenden Panel hinzugefügt werden. Die PictureBoxes werden dabei dem Namen nach sortiert und gleichartige Pictureboxes werden überlappend dargestellt.
Etwa wie im Anhang Karten_sortiert.jpg
Das Problem:
Da die PictureBoxes sortiert werden, werden diese von oben nach unten gezeichnet.
Genauer: Die neuste PictureBox wird dem Panel hinzugefügt und über eine Sortiermethode werden die Positionen der PictureBoxes bestimmt, beginnend bei der ersten (oben links).
Dabei werden leider alle folgenden PictureBoxes unter die jeweils vorhergehenden PictureBoxes gezeichnet. Etwa wie im Anhang Karten_falsch-sortiert.jpg
Um die PictureBoxes dann wieder sichtbar zu machen, verwende ich die Methode "SendToFront". Dieser Aufruf führt leider zu dem im Topic beschriebenen Flackern.
Der Code:
Hinweise:
cardContainer ist das Panel, auf dem die PictureBoxes sortiert werden
Die Pfeile (z.B.// -->1) markieren meine vergeblichen Versuche, das Flackern zu unterdrücken.
Die Vergeblichen Versuche:
Meine Versuche, das Problem zu lösen habe ich im obigen Code markiert.
-->1:
SuspendLayout() "Unterbricht vorübergehend die Layoutlogik für das Steuerelement." Auf dem Formular ausgeführt ändert es nichts am Flackern der Picturebox.
-->2:
SuspendLayout() auf dem Panel ausgeführt ändert ebenfalls nichts am Flackern.
-->3:
SuspendLayout() auf der PictureBox ausgeführt hilft auch nicht. Auch die Kombination aus allen bewirkt nichts.
-->4:
Ein Hide() auf die PictureBox führt natürlich ebenfalls zu einem Flackern, da nun alle PictureBoxes ausgeblendet - sortiert - eingeblendet werden. Hier muss es logischerweise flackern, auch wenn es ein wenig angenehmer wirkt, weil die BringToFront-PictureBox nicht immer in den Vordergrund gezeichnet wird.
DoubleBuffer:
Auch das aktivieren des DoubleBuffers auf der Form über den Code
führte nicht zum erhofften Ergebnis.
Ich wäre für jeden Hinweis dankbar, ich habe keine Idee mehr, was ich noch anders machen kann.
Torsten
nachdem ich nun seit ca. 6 Stunden vergeblich versucht habe das Problem zu lösen, möchte ich mein Problem einmal hier schildern.
Die Anforderung:
Nach einem Klick in eine Listbox soll eine PictureBox einem bestehenden Panel hinzugefügt werden. Die PictureBoxes werden dabei dem Namen nach sortiert und gleichartige Pictureboxes werden überlappend dargestellt.
Etwa wie im Anhang Karten_sortiert.jpg
Das Problem:
Da die PictureBoxes sortiert werden, werden diese von oben nach unten gezeichnet.
Genauer: Die neuste PictureBox wird dem Panel hinzugefügt und über eine Sortiermethode werden die Positionen der PictureBoxes bestimmt, beginnend bei der ersten (oben links).
Dabei werden leider alle folgenden PictureBoxes unter die jeweils vorhergehenden PictureBoxes gezeichnet. Etwa wie im Anhang Karten_falsch-sortiert.jpg
Um die PictureBoxes dann wieder sichtbar zu machen, verwende ich die Methode "SendToFront". Dieser Aufruf führt leider zu dem im Topic beschriebenen Flackern.
Der Code:
Hinweise:
cardContainer ist das Panel, auf dem die PictureBoxes sortiert werden
Die Pfeile (z.B.// -->1) markieren meine vergeblichen Versuche, das Flackern zu unterdrücken.
Code:
// Karten neu anordnen int cardCount = 0; int cardTypeCount = 0; // this.SuspendLayout(); // -->1 // cardContainer.SuspendLayout(); // -->2 foreach (string card in cardObjects) { foreach (Control ctl in cardContainer.Controls) { if (ctl.Name == card) { // Karte positionieren entsprechend der vorhandenen Anzahl in diesem Panel // ctl.SuspendLayout(); // -->3 // ctl.Hide(); // -->4 ctl.Location = new System.Drawing.Point(10+ cardTypeCount * 140, 10 + 20 * cardCount); cardCount++; // TODO: Es flackert... ctl.BringToFront(); } } cardCount = 0; cardTypeCount++; } // Jetzt alle Karten anzeigen foreach (Control ctl in cardContainer.Controls) { // ctl.Show(); // -->4 // ctl.ResumeLayout(); // -->3 } // cardContainer.ResumeLayout(); // -->2 // this.ResumeLayout(); // -->1
Meine Versuche, das Problem zu lösen habe ich im obigen Code markiert.
-->1:
SuspendLayout() "Unterbricht vorübergehend die Layoutlogik für das Steuerelement." Auf dem Formular ausgeführt ändert es nichts am Flackern der Picturebox.
-->2:
SuspendLayout() auf dem Panel ausgeführt ändert ebenfalls nichts am Flackern.
-->3:
SuspendLayout() auf der PictureBox ausgeführt hilft auch nicht. Auch die Kombination aus allen bewirkt nichts.
-->4:
Ein Hide() auf die PictureBox führt natürlich ebenfalls zu einem Flackern, da nun alle PictureBoxes ausgeblendet - sortiert - eingeblendet werden. Hier muss es logischerweise flackern, auch wenn es ein wenig angenehmer wirkt, weil die BringToFront-PictureBox nicht immer in den Vordergrund gezeichnet wird.
DoubleBuffer:
Auch das aktivieren des DoubleBuffers auf der Form über den Code
Code:
this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true); this.UpdateStyles();
Ich wäre für jeden Hinweis dankbar, ich habe keine Idee mehr, was ich noch anders machen kann.
Torsten
Comment