DIC
27
Rimani aggiornato sui commenti a questo articolo

Uno dei numerosi pregi introdotti da .NET è quello di evitare al progettista diversi aspetti noiosi, quali ad esempio la gestione manuale del layout, come capitava nei linguaggi come VB6 e C++, a meno di utilizzare editor predisposti appositamente per gestire layout complessi. Tuttavia anche in quei casi rimanevano diversi problemi, come ad esempio il mantenere il corretto allineamento dei controlli con le finestre, che non è banale quando il numero di controlli supera le centinaia. Con .NET, Microsoft ha messo a disposizione alcune proprietà che permettono di gestire il layout senza tuttavia sfruttare a pieno le librerie GDI+, ed infatti se provate ad inserire nella Form un TableLayoutPanel con all’interno una trentina di controlli, anche uguali, al momento del resize della stessa si avrà un terribile effetto sfarfallio, che generalmente viene chiamato flickering.

L’effetto di flickering è dovuto ad una cattiva gestione dei bit che compongono l’immagine da inviare allo schermo al momento del refresh del controllo. In pratica, ogni volta che un controllo viene aggiornato nel contenuto, come ad esempio nel caso di ridimensionamento, questo deve essere ridisegnato da zero. Ma se il colore in un determinato punto rimane lo stesso non ci sarebbe alcun bisogno di rigenerarlo, cosa che non viene gestita automaticamente da .NET generando perciò il problema.

Per rimuovere quel fastidioso effetto (e badate bene che la soluzione vale per diversi controlli di .NET), il modo migliore è il seguente: estendere la classe del controllo e settarlo in modo che il sistema bufferizzi i dati da inviare allo schermo, in modo da non doverlo continuamente ridisegnare daccapo.

using System.ComponentModel;
using System.Windows.Forms;

namespace MyNameSpace
{
    ///
    /// Double Buffered layout panel - removes flicker during resize operations.
    ///
    public partial class DBLayoutPanel : TableLayoutPanel
    {
        public DBLayoutPanel()
        {
            InitializeComponent();
            SetStyle(ControlStyles.AllPaintingInWmPaint |
              ControlStyles.OptimizedDoubleBuffer |
              ControlStyles.UserPaint, true);
        }

        public DBLayoutPanel(IContainer container)
        {
            container.Add(this);
            InitializeComponent();
            SetStyle(ControlStyles.AllPaintingInWmPaint |
              ControlStyles.OptimizedDoubleBuffer |
              ControlStyles.UserPaint, true);
        }
    }
}

A questo punto basta sostituire il controllo al precedente ed il gioco è fatto. Per evitare di perdere tutte le impostazioni settate, potete andare nel file nomeform.designer.cs e sostituire la voce TableLayoutPanel con DBLayoutPanel. In questo modo la soluzione è rapida e soprattutto indolore. Buon lavoro! ok emoticon

Nessun commento per questo articolo
Sentiti libero/a di lasciare un commento a questo articolo, mi fa piacere se mi scrivi!
Se vuoi avere anche tu un'immagine personalizzata, iscriviti subito a gravatar! È gratis!