Wie kann ich dazu beitragen, dass ein panel zu Blättern programmgesteuert zu setzen Ihren AutoSized Bild box
Ich habe eine picture box-set auf AutoSize, so dass das Bild zwingt zu wachsen, um das Bild in voller Größe.
Die Bild-box ist in ein panel mit autoScroll = true, so dass die Bildlaufleisten angezeigt, wenn das Bild größer ist als das panel.
Wie kann ich programmatisch scrollen Sie das Bedienfeld an, wenn der Benutzer auf die drags auf dem Bild, damit der Neupositionierung des Bildes.
Ich habe versucht, verwendet das MouseMove-Ereignis die Erfassung der letzten X-und Y-Positionen der Maus, um zu berechnen, wie viel die Maus bewegt hat, und justiert die Vertikale und Horizontale Scroll-Werte der Platte.
Dem bewegt sich das Bild um, aber es springt ganz über dem Platz, und Schriftrollen unvorhersehbar.
Wie kann ich das erreichen?
Hier ist, was ich in meiner Maus-events...
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (dragging)
{
if (e.Button == MouseButtons.Left)
{
//move the image inverse to direction dragged
int horizontalChange = (e.X - startingX) * -1;
int newHorizontalPos = panel1.HorizontalScroll.Value + horizontalChange;
if (newHorizontalPos < panel1.HorizontalScroll.Minimum)
{
newHorizontalPos = panel1.HorizontalScroll.Minimum;
horizontalChange = 0;
}
if (newHorizontalPos > panel1.HorizontalScroll.Maximum)
{
newHorizontalPos = panel1.HorizontalScroll.Maximum;
horizontalChange = 0;
}
panel1.HorizontalScroll.Value = newHorizontalPos;
int verticalChange = (e.Y - startingY);
//move the image inverse to direction dragged
int newverticalPos = panel1.VerticalScroll.Value + verticalChange * -1;
if (newverticalPos < panel1.VerticalScroll.Minimum)
{
newverticalPos = panel1.VerticalScroll.Minimum;
verticalChange = 0;
}
if (newverticalPos > panel1.VerticalScroll.Maximum)
{
newverticalPos = panel1.VerticalScroll.Maximum;
verticalChange = 0;
}
panel1.VerticalScroll.Value = newverticalPos;
}
}
startingX = e.X;
startingY = e.Y;
}
Ist meine Logik falsch oder ist mein Verständnis von der Jury-scrolling-Funktionalität falsch?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, dein Instinkt ist richtig, aber dein Fehler ist, zu versuchen, passen Sie die Bildlaufleisten, anstatt sich die PictureBox in das scrollbare panel.
Sollten Sie abfangen der MouseMove und passen Sie die PictureBox die Location-Eigenschaft durch Bewegung der mouse delta — die Scrollbalken sollten automatisch aktualisiert, um die Bild den neuen Speicherort in Ihr.
Aktualisierung würde der code so Aussehen tho Folgendes (ungetestet):
(Auch, ich würde geneigt sein, zu erfassen die Maus ab und PictureBox-Standorten an den start des drag-und aktualisieren Sie Sie relativ zu dieser Startposition auf jedem MouseMove-Ereignis eher als inkrementelle änderungen, wie der code oben (und dein original-code ist). Der Grund für dieses ist, dass, wenn es irgendwelche unerwarteten Werte, aus welchem Grund auch immer, dann wird dies nur dazu führen, dass ein vorübergehender Effekt — der nächste gute event wird sich selbst zu korrigieren.)
Es ist springen, weil der Akt des scrolling-panel zu werfen aus der position der Maus, indem Sie die scroll-Betrag. Sie können die "echten" position der Maus (relativ von der oberen linken Ecke der Systemsteuerung) wie folgt:
vorausgesetzt, die Bild-box " Location-Eigenschaft ist (0, 0). Der beste Weg, um scrollen Sie in der Systemsteuerung die AutoScrollPosition Eigenschaft.
Können Sie die panel -
AutoScrollPosition
im MouseMove-Ereignis. Getestet und funktioniert einwandfrei.