Was nutzt HScroll / VScroll in ScrollableControl?

8

Die ScrollableControl-Klasse hat 2 geschützte boolesche Eigenschaften: HScroll und VScroll.

Als Dokument sagt:

  

Ruft einen Wert ab, der angibt, ob die horizontale Bildlaufleiste sichtbar ist, oder legt diesen fest.

Und

  

AutoScroll behält die Sichtbarkeit der Bildlaufleisten automatisch bei. Daher hat das Festlegen der HScroll- oder VScroll-Eigenschaften auf true keine Auswirkungen, wenn AutoScroll aktiviert ist.

Also benutze ich sie so, aber die Bildlaufleiste wird nicht angezeigt:

%Vor%

Wenn ich den folgenden Code verwende, funktioniert es:

%Vor%

Wenn ich sie zusammenlege, ist die Bildlaufleiste immer noch unsichtbar, und die Werte von HScroll und HorizontalScroll.Visible behalten False.

%Vor%

Also, was ist HSroll und VScroll wirklich?

Aktualisieren

Mein Code und Test

    
shingo 15.09.2017, 02:29
quelle

3 Antworten

6
Die Eigenschaft

HScroll wirkt sich nicht direkt auf die Scroll-Sichtbarkeit aus, aber verhindert, dass Scroll verborgen wird mit HorizontalScroll.Visible value

Wenn HorizontalScroll.Visible auf true gesetzt wird als HScroll erhält auch einen Wert true (siehe 2. Zeile in der Tabelle)

Wenn AutoScroll auf wahr gesetzt ist HorizontalScroll.Visible bleibt immer true und HScroll hat keinen Einfluss (siehe die letzten 2 Zeilen)

Machen Sie eine App mit Control, die 3 Buttons mit dem nächsten Handler-Code enthält, und spielen Sie damit, um zu sehen, was genau dort passiert:

%Vor%

Verwendung (AutoScroll = false )

So zeigen Sie den Bildlaufsatz HorizontalScroll.Visible bis true

manuell an

Scroll-Set HScroll manuell auf false und dann HorizontalScroll.Visible auf false

ausblenden

Verwendung (AutoScroll = true )

HorizontalScroll.Visible ist immer true und kann nicht geändert werden

HScroll wirkt sich nicht auf etwas aus

    
ASpirin 19.09.2017 07:30
quelle
4
  

Also, was ist HSroll und VScroll wirklich?

Sie setzen sie auf "true", wenn Sie die Absicht zum Anzeigen der Bildlaufleisten haben. Aber das ist nicht genug, Sie müssen auch angeben, was sie anzeigen sollen. Eine Bildlaufleiste muss die Daumengröße, die minimale und maximale Position und die aktuelle Position kennen.

Sie kämpfen mit dem internen ApplyScrollbarChanges () Methode . Eine Sache ist es, die Bildlaufleisten auszublenden, auch wenn HScroll oder VScroll auf wahr gesetzt ist, wenn es nicht genügend Informationen zur Konfiguration der Balken hat. Der Code der Methode ist zu groß, um hier zu passen. Kurz gesagt leitet er diese Information von:

ab
  1. Der Wert der AutoScrollMinWidth-Eigenschaft.
  2. Wenn das Steuerelement ein nicht standardmäßiges Layout aufweist, kann das Layout-Modul dieses Steuerelements die Scroll-Grenzen bestimmen. Dies ist nur bei den Steuerelementen FlowLayoutPanel und TableLayoutPanel der Fall.
  3. Wenn das Steuerelement das Standardlayout hat, durchläuft es die untergeordneten Steuerelemente, um ihre Grenzen zu sehen.

Punkt 2 ist ein ansprechender Anpassungswinkel, aber sie haben die LayoutEngine-Klasse intern gemacht, sodass Sie keine eigene ableiten können. Punkt 3 unterscheidet sich nicht grundlegend von dem, was AutoLayout = true bereits tut. Es funktioniert jedoch, fügen Sie einfach ein Steuerelement im Konstruktor hinzu, überschreiben Sie OnClientSizeChanged (), um AdjustFormScrollbars (true) aufzurufen, und Sie sehen nun die Bildlaufleiste.

Was Punkt 1 übrig lässt, um die Bildlaufleisten zu steuern. Der Property-Setter sieht so . Yup, setzt es die AutoScroll-Eigenschaft hinter true zurück:)

Legen Sie einfach die AutoScrollMinSize-Eigenschaft fest, um die Bildlaufleisten zu steuern.

    
Hans Passant 19.09.2017 09:50
quelle
2

HScroll zeigt die horizontale Bildlaufleiste an, wenn die Eigenschaft AutoScroll nicht definiert ist.

In all Ihren Beispielen, in denen die Bildlaufleisten nicht angezeigt werden, liegt das daran, dass Sie AutoScroll auf false setzen und die Anzeige von Bildlaufleisten ausblenden.

    
Bejasc 19.09.2017 04:08
quelle

Tags und Links