Flackern



  • ich leere die Controls in einen Panel mit Clear() aund fülle sie dann wieder mit AddRange().Aber das flackert ziemlich stark,gib es einen anderen Weg den Inhalt eines Panels auszutauschen oder einen Weg das Flackern zuverhindern?



  • In der Hilfe steht etwas von:

    SuspendLayout();
    ...
    ResumeLayout();
    


  • Ich benutzen schon SuspendLayout,aber das flackern kommt nicht vom Layoutänderungen,sondern will für einen kurzen Augenblick keine Controls im Panel sind und das auch gezeichnet wird,bevor die neuen Controls reingeschreiben werden.

    public void SelectContent(object sender, EventArgs e)
            {
                ContentPanel.SuspendLayout();
                Multi_Content content;
                closeTimer.Stop();
    
                if (sender is Multi_Content)
                {
                    content = (Multi_Content)sender;
                }
                else
                {
                    content = (Multi_Content)((Button)sender).Tag;
                    if (((ContentButton)sender).Flash)
                    {
                        ((ContentButton)sender).Flash = false;
                    }
                }
                if (!content.Active)
                {  
                    ContentPanel.Controls.Clear();
                    ContentPanel.Controls.AddRange(content.ToArray());
                    content.Active = true;  
                }
                else
                {
                    ContentPanel.Controls.Clear();
                    content.Active = false;
                }
                foreach (Control c in FlowLayout.Controls)
                {
                    if (c != sender&&!(sender is Multi_Content))
                    {
                        if (((Multi_Content)c.Tag).Active)
                        {
                            ((Multi_Content)c.Tag).Active = false; 
                            c.Refresh();
                            break;
                        }  
                    }
                }
                if (!(sender is Multi_Content))
                {
                    ((Button)sender).Refresh();
                }
                else
                {
                    foreach (Control c in FlowLayout.Controls)
                    {
                        c.Refresh();
                    }
                }
                ContentPanel.ResumeLayout();
            }
    


  • hatte das prob auch mal aber in einem etwas anderen kontext (wollte was schnell zeichnen und hat trotz db geflackert). Ich has dann etwas umständlich über die API gelöst... ABER es hat funktioniert:

    hab den Code jetzt nicht bei der Hand aber wenn du mir n bisschen zeit gibtst treib ich den wieder auf.

    irgendwie so in der Art:

    in ner neuen Klasse:

    [DllImport("<weißichnichtmehrgenau.dll>")]
    public static extern void LockWindowUpdate(IntPtr hwnd);
    

    du musst für DllImport() irgendeinen namespace einbinden... ich glaub es war InteropServices...

    bevor du das panel leerst schreibst du dann (gesetzt dem fall die neue klasse heißt 'Api') :

    Api.LockWindowUpdate(panel.Handle);
    

    und nach dem wiederauffüllen:

    Api.LockWindowUpdate((IntPtr)0); //Gibt Fenster wieder frei
    

    sry für die Ungenauigkeiten aber ich guck nach ob ich den code noch finde 😉


Anmelden zum Antworten