2011-12-31 11 views
5

Utilizzando VS2010 e .NET 4.0 con C# e WinForms:.Come forzare la barra di scorrimento verticale sempre visibile da AutoScroll in WinForms?

voglio sempre una barra di scorrimento verticale per mostrare per la mia pannello come un disabile barra di scorrimento (quando non è necessario, e un permetteva quando può essere utilizzato

quindi è come un ibrido scorrimento automatico. ho provato con VScrollBars ma io non riesco a capire dove mettere loro di fare questo lavoro.

Essenzialmente ho un controllo utente che agisce come un "documento" dei controlli, le sue dimensioni cambiano, quindi quando si utilizza lo scorrimento automatico funziona perfettamente.La barra di scorrimento viene visualizzata quando l'usercontrol non si adatta e l'utente può spostarlo updown.

In pratica è come un browser web. Tuttavia, i controlli di ridisegno richiedono molto tempo (sono moduli con molti campi e pulsanti ecc. All'interno di gruppi in una griglia all'interno di un pannello: P

In ogni caso, quando lo scorrimento automatico abilita la barra di scorrimento verticale, ci vuole un po 'per ridisegnare la finestra. Mi piacerebbe SEMPRE mostrare la barra di scorrimento verticale come sopra indicato (con la funzionalità di abilitazione/disabilitazione)

Se qualcuno ha qualche aiuto, ho letto molti post sull'argomento di autoscroll, ma nessuno mi ha chiesto cosa Sto chiedendo e non riesco a trovare una soluzione

+3

Questo è ridicolmente difficile da fare. Il codice che controlla le barre di scorrimento sono metodi privati ​​in ScrollableControl, non può sovrascriverli. Cercando di fingere collegando un VScrollBar nel pannello che è nascosto durante lo scorrimento è necessario causare problemi di cui non sono riuscito a liberarmi. Ho mollato. –

risposta

3

Puoi utilizzare la funzionalità di scorrimento automatico del pannello, devi solo inviarlo un messaggio di Windows per mostrare la barra di scorrimento verticale:

<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 

La barra di scorrimento verrà visualizzata e verrà visualizzata come se fosse possibile scorrere, ma non farà nulla finché non sarà effettivamente pronta per lo scorrimento. Se lo disabiliti, non verrà riattivato automaticamente, quindi questo è probabilmente l'approccio migliore.

Inoltre, per migliorare le prestazioni durante il ridimensionamento, è possibile chiamare SuspendLayout sul pannello prima dell'aggiornamento e ResumeLayout al termine.

+0

Ho provato a farlo, ma non sembrava importare. Il layout di sospensione/ripresa. Questo metodo è diverso dal semplice andare .Visible = true sull'oggetto VerticalScroll? Perché non funziona correttamente. La barra di scorrimento non è stata modificata. – user1104203

+0

Sì, questo metodo è diverso dall'impostare 'Visible = true' (questo è quello che ho provato prima, ma .Net lo ignora completamente). –

4

C# versione di risposta di 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

Ciò richiede: using System.Runtime.InteropServices; – Bill

+0

@bill grazie - aggiunto – fiat

+0

Questo ha funzionato solo per me quando l'ho inserito in VisibleChanged(). Sembra che abbia effetto solo se il controllo è visibile (?!) –

0

Ecco cosa ha risolto questo per me. Il mio caso è che ho un pannello inserito tra altri tre pannelli senza alcun grado di libertà in nessuna direzione. Avevo bisogno che questo pannello fosse così grande che l'intera struttura sarebbe uscita dal mio schermo 1920x1080. La soluzione è in realtà molto semplice. Per il pannello che necessita di barre di scorrimento, impostare la proprietà AutoScroll su true. Quindi, aggiungi un altro controllo nella posizione all'estrema destra (posizione in basso a destra). Il controllo che scelgo è un'etichetta che ho reso invisibile .... E questo è tutto. Ora il mio pannello occupa la sua area riservata, ma posso scorrere fino alle dimensioni che mi servivano e usarlo per le dimensioni che mi servono. Se sono necessarie solo barre di scorrimento orizzontali, aggiungere il controllo invisibile all'esterno a sinistra, per la verticale solo in basso.

La dimensione effettiva del pannello è quella a cui viene limitato quando lo si visualizza, ma la dimensione virtuale è dettata dal controllo invisibile.

0

Ciò che ha funzionato per me era ignorare la chiamata CreateParams e abilitare lo stile WS_VSCROLL.

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

Il AutoScroll logica ora regolare i limiti di scorrimento, senza mai nascondere la barra di scorrimento.

+0

Soluzione semplice e semplice, ma sfortunatamente la logica 'AutoScroll' aggiorna solo i limiti di scorrimento e non disabilita la barra di scorrimento quando tutti i contenuti si adattano all'interno. C'è un modo per implementare il comportamento di abilitazione/disabilitazione in cima a questo? – glopes