it-swarm.com.de

Wie kann ich mein Panel mit meinem Mausrad scrollen?

Ich habe ein Fenster in meinem Formular, in dem AutoScroll auf true gesetzt ist, sodass automatisch eine Bildlaufleiste angezeigt wird.

Wie kann ich es so machen, dass ein Benutzer sein Mausrad verwenden kann, um das Bedienfeld zu scrollen? Danke SO.

37
Sergio Tapia

Das Panel oder ein Steuerelement im Panel muss den Fokus haben. Wenn das Steuerelement mit Fokus über Bildlaufleisten verfügt, wird anstelle des Bereichs ein Bildlauf durchgeführt.

28
Jon B

Was für mich funktionierte, war das Hinzufügen von panel1_MouseEnter EventHandler:

private void panel1_MouseEnter(object sender, EventArgs e)
{
    panel1.Focus();
}
55
beam022

Der folgende Code funktioniert für mich .....

    Public Form
{
InitializeComponent();  
this.MouseWheel += new MouseEventHandler(Panel1_MouseWheel);
}

 private void Panel1_MouseWheel(object sender, MouseEventArgs e)
        {
         panel1.Focus();
         }
15
Nivas

In der Designer-Datei können Sie die folgende Codezeile hinzufügen. Das MouseWheel-Ereignis wird in der Ereignisliste im Eigenschaftenfenster nicht dokumentiert.

this.Panel1.MouseWheel+= System.Windows.Forms.MouseEventHandler(this.Panel1_MouseWheel);

Panel1_MouseWheel wird ausgelöst, wenn Sie mit der Maus rollen

Fügen Sie den Code in die CS-Datei ein

2
Pavan Navali

Stellen Sie sicher, dass Ihr Panel den Fokus hat. Dies ist ein einfacher Code, um die Bildlaufleiste des Bedienfelds zu scrollen. Ich hoffe das hilft. :) Code hier eingeben

        if(e.Delta > 0)
        {

            if (pnlContain.VerticalScroll.Value - 2 >= pnlContain.VerticalScroll.Minimum)
                pnlContain.VerticalScroll.Value -= 2;
            else
                pnlContain.VerticalScroll.Value = pnlContain.VerticalScroll.Minimum;
        }
        else
        {
            if (pnlContain.VerticalScroll.Value + 2 <= pnlContain.VerticalScroll.Minimum)
                pnlContain.VerticalScroll.Value += 2;
            else
                pnlContain.VerticalScroll.Value = pnlContain.VerticalScroll.Maximum;
        }
2

Ich verwende ein Windows-Formular, bei dem BorderStyle auf none gesetzt ist, wobei ich ein Bedienfeld verwende, um alle meine Steuerelemente zu verwenden. Es sieht also nett aus (Farbunterschied und ähnliches).

Was habe ich vergessen?

   public myForm()
   {
        InitializeComponent();
        this.DoubleBuffered = true;
   }

DoubleBuffered ist magisch, habe ich bemerkt ..

1
CularBytes

Das Bewegen des Scroll-Rads sollte das MouseMove-Ereignis des Steuerelements auslösen. Das MouseEventArgs-Argument hat eine Eigenschaft namens Delta, die die (signierte) Anzahl der Kerben angibt, die das Mausrad verschoben hat. Sie können diese Eigenschaft verwenden, um den Bereich zu scrollen.

0
MusiGenesis

Die von Beam022 bereitgestellte Lösung (siehe oben) funktionierte für mich, während andere Lösungen dies nicht taten. In meinem Fall habe ich versucht, ein DataGridView-Steuerelement mit dem Mausrad-Ereignis zu scrollen. 

Der DataGridView_MouseWheel-Ereignishandler wurde aufgerufen, der FirstDisplayedScrollingRowIndex-Wert wurde jedoch nicht geändert. Der Wert war immer '0', auch nachdem er explizit auf 1 gesetzt wurde. Es ist, als wäre die Eigenschaft nur lesbar. 

Immer noch Repros in .NET Framework 4.6.

0
GrayDwarf

In meinem Fall war der gesamte Client-Bereich des Bedienfelds mit UserControls belegt (kein Pixel des inneren Bereichs, außer den Bildlaufleisten).

In diesem Fall erhält das Bedienfeld keine Mausereignisse und fokussiert niemals (das Klicken auf die Bildlaufleiste gilt nicht als "im Bedienfeld befindlich").

Ich musste dem Konstruktor meiner abgeleiteten UserControl-Klasse die folgenden Zeilen hinzufügen:

MouseEnter += delegate {
   Parent?.Focus();
};

Jetzt funktioniert es gut, da ich keinen scrollbaren Inhalt in den UserControls habe.

0