Thomas Woelfers Baustatik Blog

Baustatik-Software und was sonst des Weges kommt

Windows Forms TreeView Control: Hässliche Scrollbars loswerden

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.

tree1.png

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.

tree2.png

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.

tree3.png

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.

Comments (2) -

  • Christoph Dunker

    3/1/2005 6:27:59 PM |

    Sehr geehrter Herr Woelfers,

    die Erfahrung mit den "Hässlichen Scrollbars" habe ich auch machen müssen.
    Der Fehler ist bei mir allerdings nur aufgetreten, wenn ich den TreeView gefüllt habe,
    bevor er das erste Mal angezeigt wurde. Wenn man also erst beim ersten Paint
    den TreeView füllt und ein sofortiges repaint veranlasst, ist das Problem auch vorbei.
    Das ganze ist nicht sichtbar.
    Ich hatte das Problem, weil ich den Treeview in einer Tab-Page hatte,
    die beim Start des Programms nicht geöffnet war. Wenn ich nun auf der 1. Tab-Page
    die Füllung des TreeViews per Knopfdruck veranlasste, war die "Hässliche Scrollbar" in dem TreeView.
    Die "Hässliche Scrollbar" war nicht zu sehen, wenn ich die Tab-Page auf dem sich der TreeView befindet
    einmal geöffnet, dann wieder zur ursprünglichen Tab-Page gewechselt  habe und jetzt erst das Füllen des
    TreeViews veranlasst habe.

    Naja, es würde mich freuen, wenn Sie das noch erwähnen könnten.

    Mit freundlichen Grüßen un der Bitte um Feedback,

    Christoph Dunker

    Wegen Spam nur soviel zu meiner Email-Adresse:
    meneque AT gmx DOT de
    Sprich:
    meneque
    @
    gmx
    .
    de

  • thomas woelfer

    3/3/2005 8:42:37 AM |

    Hallo Herr Dunker,

    ihr Kommentar steht ja schon hier: kein grund, das ich das nochmal abtippe... Smile

Comments are closed