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.
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.
Was für mich funktionierte, war das Hinzufügen von panel1_MouseEnter
EventHandler:
private void panel1_MouseEnter(object sender, EventArgs e)
{
panel1.Focus();
}
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();
}
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
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;
}
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 ..
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.
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.
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.