À mon ancien travail, nous avons eu du mal à faire en sorte que notre application riche en UI se peigne instantanément et en douceur. Nous utilisions des contrôles standard .Net, des contrôles personnalisés et des contrôles devexpress.
Après beaucoup de recherches sur Google et l'utilisation de Reflector, j'ai découvert le message WM_SETREDRAW de win32. Cela arrête vraiment le dessin des contrôles pendant que vous les mettez à jour et peut être appliqué, si je me souviens bien, au panneau parent/conteneur.
Il s'agit d'une classe très simple montrant comment utiliser ce message :
class DrawingControl
{
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);
private const int WM_SETREDRAW = 11;
public static void SuspendDrawing( Control parent )
{
SendMessage(parent.Handle, WM_SETREDRAW, false, 0);
}
public static void ResumeDrawing( Control parent )
{
SendMessage(parent.Handle, WM_SETREDRAW, true, 0);
parent.Refresh();
}
}
Il y a des discussions plus détaillées à ce sujet - cherchez sur Google "C# and WM_SETREDRAW", par exemple.
C# Jitter
Suspension des mises en page
Et pour ceux que cela intéresse, voici un exemple similaire en VB :
Public Module Extensions
Private Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Boolean, ByVal lParam As IntPtr) As Integer
End Function
Private Const WM_SETREDRAW As Integer = 11
' Méthodes d'extension pour Control
Public Sub ResumeDrawing(ByVal Target As Control, ByVal Redraw As Boolean)
SendMessage(Target.Handle, WM_SETREDRAW, True, IntPtr.Zero)
If Redraw Then
Target.Refresh()
End If
End Sub
Public Sub SuspendDrawing(ByVal Target As Control)
SendMessage(Target.Handle, WM_SETREDRAW, False, IntPtr.Zero)
End Sub
Public Sub ResumeDrawing(ByVal Target As Control)
ResumeDrawing(Target, True)
End Sub
End Module
3 votes
Quelqu'un peut-il s'il vous plaît m'expliquer ce qu'est un dessin ou une peinture ici dans ce contexte ? (Je suis nouveau sur .net) au moins fournir un lien.
1 votes
C'est vraiment une honte (ou risible) que .Net existe depuis plus de 15 ans et que ce soit toujours un problème. Si Microsoft passait autant de temps à résoudre de vrais problèmes comme le scintillement de l'écran que, disons, Get Windows X les logiciels malveillants, alors cela aurait été résolu il y a longtemps.
0 votes
@jww Ils l'ont corrigé; ça s'appelle WPF.