2009-09-15 7 views
2

Salut J'utilise des formulaires dans .net et j'ajoute dynamiquement de nombreux libellés liés pendant l'exécution, J'ajoute ces liens au panneau et j'ajoute ce panneau au winform. Lorsque le numéro de linklabels augmente, le formulaire affiche une barre de défilement automatique (verticale) ... Maintenant, lorsque je défile en utilisant cet autoscroll, le formulaire ne met pas à jour sa vue lorsque je défile, le formulaire est actualisé uniquement lorsque j'arrête de défiler. Aussi quand il rafraîchit il a l'air trop mauvais .. je peux voir comment il dessine lentement ....smooth scrolling .net forms

Est-ce que quelqu'un a traité cela avant?

J'ai essayé form.refresh() dans le gestionnaire d'événements de défilement, mais cela ne semble pas aider ..

Des indices?

Répondre

2

Essayez de définir la propriété DoubleBuffered de votre formulaire sur True.

Mise à jour: en fait, cela ne fera probablement rien puisque vos contrôles sont sur un panneau de votre formulaire. Le contrôle Panel intégré n'a pas de propriété DoubleBuffered exposée, donc la façon de le faire est d'ajouter un nom UserControl DBPanel à votre projet, et de changer le code pour qu'il hérite de Panel au lieu de UserControl (vous pouvez changer cela manuellement dans le fichier CS après l'avoir ajouté). Lorsque vous ajoutez le UserControl, le code ressemblera à ceci:

public partial class DBPanel : UserControl 
{ 
    public DBPanel() 
    { 
     InitializeComponent(); 
    } 
} 

Modifier afin qu'il ressemble à ceci (changement UserControl Panel et ajouter le « this.DoubleBuffered = true; » ligne au constructeur):

public partial class DBPanel : Panel 
{ 
    public DBPanel() 
    { 
     InitializeComponent(); 
     this.DoubleBuffered = true; 
    } 
} 

Lorsque vous construisez le projet, le compilateur barf sur une ligne commençant par « this.AutoScaleMode ... ». Supprimer cette ligne et reconstruire.

Vous pouvez maintenant utiliser le contrôle DBPanel sur votre formulaire à la place d'un panneau standard, et cela devrait prendre en charge votre problème de scintillement.

Mise à jour 2: désolé, je n'ai pas suffisamment lu votre question. Vous avez raison, le panneau ne se redessine pas tant que vous n'avez pas relâché le pouce de la barre de défilement. Je pense que pour atteindre cet effet, il vous suffira de créer votre propre UserControl.

Fondamentalement, vous auriez juste un contrôle UserControl avec un VScrollBar ancré sur la droite, et un panneau avec AutoScroll = false ancré sur la gauche occupant le reste de l'espace. Les événements Scroll et ValueChanged du VScrollBar se déclenchent lorsque vous déplacez le curseur vers le haut et vers le bas. Ainsi, après avoir ajouté un groupe de LinkLabels au panneau interne, vous pouvez utiliser ces événements pour modifier la position supérieure du panneau et obtenir l'effet de défilement dynamique vous cherchez.

Il est un peu irritant que le panneau ne fonctionne pas de cette façon par défaut, ou même qu'il dispose d'un réglage qui le permet.

+0

Nope qui ne semble pas fonctionner :( – FatDaemon

+0

Ouais, voir ma mise à jour. – MusiGenesis

+0

i essayé exactement la même chose public partial class CustomPanel: Panel { CustomPanel public() { InitializeComponent(); this.DoubleBuffered = true; this.AutoSize = true; this.AutoSizeMode = AutoSizeMode.GrowAndShrink; } ne fonctionne pas ... Le formulaire/panneau est mis à jour seulement après avoir relâché le bouton de la souris et non lorsque la souris a cliqué sur la barre de défilement et fait défiler vers le bas .. – FatDaemon

5

Faites-le apparaître dans votre classe (UserControl, Panel, etc.), puis il fonctionnera avec le glisser-déposer.

private const int WM_HSCROLL = 0x114; 
private const int WM_VSCROLL = 0x115; 

protected override void WndProc (ref Message m) 
{ 
    if ((m.Msg == WM_HSCROLL || m.Msg == WM_VSCROLL) 
    && (((int)m.WParam & 0xFFFF) == 5)) 
    { 
     // Change SB_THUMBTRACK to SB_THUMBPOSITION 
     m.WParam = (IntPtr)(((int)m.WParam & ~0xFFFF) | 4); 
    } 
base.WndProc (ref m); 
} 
+0

Monsieur, vous êtes un gentleman. Ce problème m'a énervé :) – Martin

+0

Vous êtes les bienvenus. – CharlesW

3

Si vous ne souhaitez pas utiliser les appels WinAPI, vous pouvez le faire:

// Add event handler to an existing panel 
MyPanel.Scroll += new EventHandler(MyPanelScroll_Handler); 

// Enables immediate scrolling of contents 
private void MyPanelScroll_Handler(System.Object sender, System.Windows.Forms.ScrollEventArgs e) 
{ 
    Panel p = sender As Panel; 
    if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll) { 
     p.HorizontalScroll.Value = e.NewValue; 
    } else if (e.ScrollOrientation == ScrollOrientation.VerticalScroll) { 
     p.VerticalScroll.Value = e.NewValue; 
    } 
}