Laden...

Programmgesteuerte Positionierung einer ScrollBar

Erstellt von pegasus2 vor 19 Jahren Letzter Beitrag vor 18 Jahren 2.403 Views
P
pegasus2 Themenstarter:in
120 Beiträge seit 2005
vor 19 Jahren
Programmgesteuerte Positionierung einer ScrollBar

Hallo Programmierer,
ich habe ein Problem mit der Ansteuerung einer ScrollBar. Ich ziehe zunächst eine Komponente in ein Panel welche an einer bestimmten Stelle positioniert wird, funktioniert auch alles wunderbar.

Da bereits das Panel im gescrollten Zustand vorliegen kann (pan_Plantafel.AutoScrollPosition.Y != 0), möchte ich am liebsten die AutoScrollPosition.Y setzten können. Leider läßt diese Eigenschaft aber kein Schreiben zu (Read only).

Mit der Möglichkeit, die zuletzt angefaßte Komponente über


SetAutoScrollMargin(50, (int)(pan_Plantafel.Height / 2));
ScrollControlIntoView(btn_global.Parent);

zu erreichen und dann mittig zu positionieren bin ich auch nicht recht glücklich geworden da jetzt die Positionierung meiner Komponente nicht immer übereinstimmt.

Der nächste Versuch war dann, das Paint-Ereignis aufzurufen. Dazu folgender Code:



        mit y_Scroll1 = AutoScrollPosition.Y (merke ich mir global)

        ScrollOrientation scroll_Orient_Y = new ScrollOrientation();
        scroll_Orient_Y = ScrollOrientation.HorizontalScroll;
        ScrollEventArgs ePlan_Y = new ScrollEventArgs(type1, y_Scroll1, scroll_Orient_Y);        
        ePlan_Y.NewValue = y_Scroll1;        
        pan_Plantafel_Scroll(pan_Plantafel, ePlan_Y);

bin ich auch nicht weiter gekommen. Vielleicht hat ja schon jemand Erfahrungen mit dem setzen der Scroll-Position gesammelt?

4.221 Beiträge seit 2005
vor 19 Jahren

AutoScrollPosition ist nicht schreibgeschützt....

Erstelle einen neuen Point und weise diesen der AutoScrollPosition zu

this.AutoScrollPosition=new Point(this.AutoScrollPosition.X,this.AutoScrollPosition.Y+10);

wobei Du this noch durch Dein Objekt ersetzen musst.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

P
pegasus2 Themenstarter:in
120 Beiträge seit 2005
vor 19 Jahren

Super, es funktionierte sofort, mußte nur noch "+" durch "-" ersetzen. Folgender Code brachte Erfolg:

        
//wird in Scroll-Ereignis aufgerufen, Variablen x_Scroll + y_Scroll sind public definiert
x_Scroll = this.pan_Plantafel.AutoScrollPosition.X;
y_Scroll = this.pan_Plantafel.AutoScrollPosition.Y;

pan_Plantafel.AutoScrollPosition = new Point(pan_Plantafel.AutoScrollPosition.X - x_Scroll, pan_Plantafel.AutoScrollPosition.Y - y_Scroll);

Vielen Dank für die schnelle Hilfe, ohne dieses Beispiel hätte ich bestimmt noch lange gesucht. 🙂 Leider war nur ein Beispiel in der Hilfe zum Neu-Anlegen eines Buttons verfügbar.


Button myButton = new Button();
myButton.Location = New Point( 0 + panel1.AutoScrollPosition.X, 0 + panel1.AutoScrollPosition.Y);
panel1.Controls.Add(myButton);

Warum man allerdings auf die Eigenschaft AutoScrollPosition.Y nicht direkt schreibend zugreifen kann bleibt mir ein Rätsel. ?( Aber jetzt weiß ich ja wie's geht.

4.221 Beiträge seit 2005
vor 19 Jahren

Point ist eine Struktur und somit kein ReferenceType

Point p=this.AutoScrollPosition liefert somit zwar den Point zurück, dieser hat jedoch keiner Verbindung zum Point welcher hinter dem Property AutoScrollPosition hinterlegt ist.

Im Prinzip könnte Y auf diesem Point verändert werden.... dies würde jedoch nur diese lokale Kopie verändern. .... diesen veränderten Point müsste man dann wieder der AutoScrollPosition zuweisen.

Da Du den Point aber gar nie in einer Variable zwischengespeichert hast, merkt dies der Compiler und verweigert dies mit einem CS1612

folgender Code würde laufen:

Point p= this.AutoScrollPosition; //in Variable speichern
p.Y+=10; //Verändern
this.AutoScrollPosition=p; //wieder zuweisen

Alles unklar ? 🤔

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

P
pegasus2 Themenstarter:in
120 Beiträge seit 2005
vor 19 Jahren

Klingt auf jeden Fall logisch. Vielen Dank nochmals.

M
14 Beiträge seit 2005
vor 18 Jahren

Hallo zusammen!
Und frohes neues Jahr!

Ich hatte gerade ein ganz ähnliches Problem:

PictureBox in einem Panel,
PictureBox wird vergrößert (per StretchImage quasi ein billiger Zoom)
Scrollen über das Panel

Bei weiterem Vergrößern/-kleinern soll nun die AutoScrollPosition neu berechnet werden.

Ich habe das auch mit einem Point gemacht. Aber beim neuen Zuweisen ist das Panel immer wieder auf Position(0/0) gesprungen.
Aber jetzt ist mir aufgefallen, dass

Point p = panel1.AutoScrollPosition

negative Koordinaten ausgibt. 🤔
keine Ahnung warum.
Wenn ich dem Ding dann auch negative Koordinaten zuweise will es die aber
net haben und setzt auf Ursprung.
Also schnell noch ein *(-1) drangeknäult und jetzt funzt's.

Würd mich aber trotzdem mal interessieren wieso, weshalb, warum!!!