2008-09-24 12 views

Respuesta

12

creo this.SuspendLayout() & ResumeLayout() debe hacerlo

3

más compleja de terceros Windows Forms componentes tienen BeginUpdate y EndUpdate métodos o similares, para llevar a cabo un lote de cambios y luego dibujo del controlar. En el nivel de formulario, no existe tal cosa, pero podría interesarle habilitar Double buffering.

0

Puede utilizar los métodos SuspendLayout y ResumeLayout en el formulario o los controles al actualizar las propiedades. Si está vinculando datos a los controles, puede usar los métodos BeginUpdate y EndUpdate.

+0

métodos BeginUpdate y EndUpdate en la que? Un formulario no los tiene. –

0

SuspendLayout ayudará rendimiento si los cambios implican cambios en los controles y el diseño: MSDN

4

Puede usar el viejo Win32LockWindowUpdate función:

[DllImport("user32.dll")] 
private static extern long LockWindowUpdate(long Handle); 

try { 
    // Lock Window... 
    LockWindowUpdate(frm.Handle); 
    // Perform your painting/updates... 
} 
finally { 
    // Release the lock... 
    LockWindowUpdate(0); 
} 
+0

Hmmmm. Interesante. –

+4

Pruebe esta sintaxis en su lugar: private static extern long LockWindowUpdate (IntPtr Handle); y LockWindowUpdate (IntPtr.Zero); –

+3

LockWindowUpdate no está diseñado ni tiene la intención de detener el parpadeo. Debería usar 'SetWindowRedraw (hwnd, false)'. (http://blogs.msdn.com/b/oldnewthing/archive/2004/06/10/152612.aspx) –

12

no encuentro SuspendLayout() y ResumeLayout() hace lo que estás pidiendo. El LockWindowsUpdate() mencionado por moobaa hace el truco. Sin embargo, LockWindowUpdate solo funciona para una ventana a la vez.

También puede probar esto:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using Microsoft.Win32; 
using System.Runtime.InteropServices; 

namespace WindowsTest 
{ 
    public partial class Form1 : Form 
    { 
    [DllImport("user32.dll")] 
    public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam); 
    private const int WM_SETREDRAW = 11; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     SendMessage(this.Handle, WM_SETREDRAW, false, 0); 

     // Do your thingies here 

     SendMessage(this.Handle, WM_SETREDRAW, true, 0); 

     this.Refresh(); 
    } 
    } 
} 
Cuestiones relacionadas