2011-12-31 20 views
5

Usando VS2010 y .NET 4.0 con C# y Windows Forms:.¿Cómo forzar la barra de desplazamiento vertical siempre visible desde AutoScroll en WinForms?

Siempre quiero una barra de desplazamiento vertical para mostrar para mi panel como una barra de desplazamiento con discapacidad (cuando no es necesario, y una habilitarse uno cuando se puede utilizar

así que es como un desplazamiento automático híbrido. he intentado usar VScrollBars pero no puedo averiguar dónde colocarlos para hacer este trabajo.

Esencialmente Tengo un control de usuario que actúa como un "documento" de controles, su tamaño cambia, por lo que cuando se usa el desplazamiento automático funciona perfectamente. La barra de desplazamiento aparece cuando el control de usuario no encaja y el usuario puede moverlo hacia arriba.

Es esencialmente como un navegador web. Sin embargo, redibujar controles lleva mucho tiempo (es formularios con muchos campos y botones, etc. dentro de los grupos en una cuadrícula dentro de un panel: P

De todos modos, cuando Autoscroll habilita la barra de desplazamiento vertical, tarda un poco en volver a dibujar la ventana. Me gustaría mostrar SIEMPRE la barra de desplazamiento vertical como se indicó anteriormente (con la funcionalidad activar/desactivar)

Si alguien tiene alguna ayuda, he leído muchas publicaciones sobre el tema de desplazamiento automático, pero nadie me ha preguntado qué Estoy preguntando y no puedo encontrar una solución.

+3

Esto es ridículamente difícil de hacer. El código que controla las barras de desplazamiento son métodos privados en ScrollableControl, no puede anularlos. Tratar de falsificarlo atracando una VScrollBar en el panel que está oculto cuando se necesita desplazamiento causó problemas técnicos de los que no me podía deshacer. Me di por vencido. –

Respuesta

3

Puede usar la funcionalidad de desplazamiento automático del panel, solo necesita enviar un mensaje de Windows para mostrar la barra de desplazamiento vertical:

<DllImport("user32.dll")> _ 
Public Shared Function ShowScrollBar(ByVal hWnd As System.IntPtr, ByVal wBar As Integer, ByVal bShow As Boolean) As Boolean 
End Function 

Private Const SB_VERT As Integer = 1 


Public Sub New() 

    ' This call is required by the designer. 
    InitializeComponent() 

    ShowScrollBar(Panel1.Handle, SB_VERT, True) 
End Sub 

Aparecerá la barra de desplazamiento y aparecerá como si se pudiera desplazar, pero no hará nada hasta que esté realmente lista para desplazarse. Si lo deshabilita, no se volverá a habilitar automáticamente, por lo que este es probablemente el mejor enfoque.

Además, para mejorar el rendimiento durante el cambio de tamaño, puede llamar al SuspendLayout en el panel antes de actualizar y ResumeLayout cuando haya terminado.

+0

Traté de hacer esto, pero no parecía importar. El diseño de suspender/reanudar. ¿Este método es diferente de simplemente ir. Visible = verdadero en el objeto VerticalScroll? Porque eso no funciona correctamente. La barra de desplazamiento no está modificada. – user1104203

+0

Sí, este método es diferente a establecer 'Visible = true' (esto es lo que intenté primero, pero .Net lo ignora por completo). –

4

C# versión de la respuesta de competent_Tech

using System.Runtime.InteropServices; 

public class MyUserControl : UserControl 
{ 
    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool ShowScrollBar(IntPtr hWnd, int wBar, bool bShow); 

    private enum ScrollBarDirection 
    { 
     SB_HORZ = 0, 
     SB_VERT = 1, 
     SB_CTL = 2, 
     SB_BOTH = 3 
    } 

    public MyUserControl() 
    { 
     InitializeComponent(); 
     ShowScrollBar(this.Handle, (int) ScrollBarDirection.SB_VERT, true); 
    } 
} 
+0

Esto requiere: el uso de System.Runtime.InteropServices; – Bill

+0

@bill gracias - agregó – fiat

+0

Esto solo funcionó para mí cuando lo puse en VisibleChanged(). Parece que solo tiene efecto si el Control es Visible (?!) –

0

Esto es lo que resuelve esto para mí. Mi caso es que tengo un panel intercalado entre otros tres paneles sin ningún grado de libertad en ninguna dirección. Necesitaba que este panel fuera tan grande que la estructura completa saldría de mi pantalla de 1920x1080. La solución es realmente muy simple. Para el panel que necesita barras de desplazamiento establezca la propiedad AutoScroll en verdadero. Luego, agréguele otro control en la posición más a la derecha más abajo (posición inferior derecha). El control que elijo es una etiqueta que hice invisible ... Y eso es todo. Ahora mi panel ocupa su área restringida, pero puedo desplazarme al tamaño que necesité y usarlo para el tamaño que necesito. Si solo necesita barras de desplazamiento horizontal, agregue el control invisible hacia la izquierda, para vertical solo hacia abajo.

El tamaño real del panel es al que se restringe cuando se lo muestra, pero el tamaño virtual viene dictado por el control invisible.

0

Lo que funcionó para mí fue anular la llamada CreateParams y habilitar el estilo WS_VSCROLL.

public class VerticalFlowPanel : FlowLayoutPanel 
{ 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      var cp = base.CreateParams; 
      cp.Style |= 0x00200000; // WS_VSCROLL 
      return cp; 
     } 
    } 
} 

La lógica AutoScroll ahora ajustar los límites de desplazamiento sin tener que ocultar la barra de desplazamiento.

+0

Solución simple y simple, pero lamentablemente la lógica 'AutoScroll' solo actualiza los límites de desplazamiento y no deshabilita la barra de desplazamiento cuando todo el contenido encaja. ¿Hay alguna manera de implementar el comportamiento habilitar/deshabilitar sobre esto? – glopes

Cuestiones relacionadas