Windows Forms TreeView Control: Hässliche Scrollbars loswerden


Thomas Wölfer
Thomas Wölfer

14. Februar 2005


Das Windows Forms TreeView Control benutzt wesentlichen ein ganz normales Win32 TreeViewControl - und das kann sich durchaus unschön bemerkbar machen. In diesem Fall war es so, das die Form, die den Baum benutzt, prima angezeigt wurde: Doch leider wurde der Baum mit einem horizontalen Scrollbar dargestellt. Und der hat gleich zwei Makel: Zum einen war der Scrollbar gar nicht notwendig, zum anderen wird er als normaler Win32 Scrollbar dargestellt. Letzteres sieht gar nicht sehr schön aus, wie man im Bild beim Tree rechts sehen kann.

Ebenfalls interessant ist das Verhalten dieses Scrollbars. Verändert man nämlich die Größe des Baumes, sodas tatsächlich ein Scrollbar benötigt wird, dann nehmen diese die 'erwartete' Optik von Windows XP an - so wie im nächsten Bild zu sehen.

Macht man das Fenster dann wieder größer - dann verschwindet der Scrollbar. Auch die Win32 Optik ist danach nicht wieder zu sehen. So, wie im nächsten Bild.

So will man das aber eigentlich von Haus aus haben. Stellt sich die Frage: Was löst dieses Verhalten aus, und wie wird man das wieder los?

Ich habe dieses Verhalten schon öfter gesehen und bisher fast immer ignoriert. Im Laufe der Arbeit mit der Form verschwand der Scrollbar dann fast immer - bis aufs letzt Mal, und darum habe ich mich auf die Suche nach den Gründen gemacht.

Die sind allerdings recht einfach, sofern man einmal weiss nach was man eigentlich suchen muss. Folgendes war passiert: Der Tree wird im Modus 'DockStyle.Fill' angezeigt und füllt darum den kompletten Platz eines Panels aus. Das Panel ist die Instanz, die für die richtige Positionierung auf der Form zuständig ist.

Das bedeutet auch, das die Größe des Trees ausschließlich abhängig von der Größe des Panels ist. Das ändert aber natürlich nichts an der Tatsache, das der Tree trotzdem auch ein 'Size' Property hat. Die Size wird aber offenbar im Rahmen des Layouting nicht immer richtig gesetzt, zumindest nicht beim initialen laden der Form. Dummerweise ist es aber so, das das 'Size' Property offensichtlich die Eigenschaft ist, die an einigen Stellen für die Scrollbar-Logik verwendet wird.

Nun ist es so, das die Size im Property-Grid eingetragen wird, und die dort eingetragene Größe wird vom Forms Editor in den Quellcode der Form persistiert. Und dort bleibt sie auch, ganz gleiche was man dann später mit dem DockStyle anstellt.

Ist nun die per Size angegebene Größe größer als die Größe die sich zur Laufzeit aus dem DockStyle ergibt, dann pinselt Windows.Forms eben die hässlichen Win32 Scrollbars hin. Lösung des Problems: Man setzt die Size auf einen kleineren Wert. Auf welchen ist völlig gleichgültig, da die 'Size' bei DockStyle.Fill eigentlich keinerlei Auswirkungen haben sollte - nur muss Sie eben kleiner sein als die Größe, die sich initial aus DockStyle.Fill ergibt.