.net barre de défilement automatique problème
Je suis en train d'écrire une application en .net qui utilise le défilement automatique pour un panneau de disposition dans une boîte de dialogue.
Il semble que chaque fois que je le redimensionnement de la fenêtre, de sorte que l'axe vertical des barres de défilement apparaît à l'écran, la barre de défilement horizontale apparaît automatiquement aussi. Regardant de plus près, le deuxième barre de défilement maintenant me permet de faire défiler la fenêtre par 16 pixels (la largeur de l'autre de la barre de défilement). Afin que windows semble que j'ai besoin d'un espace client qui est au moins aussi large que c'était avant que la barre de défilement verticale est apparue.
Si j'ai maintenant redimensionner la fenêtre à 16 pixels de large (de sorte que la fenêtre de mon secteur est aussi large que c'était avant que la barre de défilement est apparu), la barre de défilement s'en va. Maintenant, si je redimensionner revenir à ce qu'il était, il reste à l'écart.
De sorte qu'il semble à moi qu'il y a un bug dans le système où la largeur minimale est en quelque sorte collante, mais la migration et downsizging la fenêtre (avec la souris, et sans tuching les barres de défilement Api) efface la condition
Quelqu'un sait d'une solution de contournement, ou suis-je en train de faire quelque chose pour le voyage jusqu'à Windows?
- J'ai couru dans cette avant; il est tombé par hasard sur votre question via Google. Mon habitude solution est de pad ma mise en page de la barre de défilement verticale de largeur (que quelqu'un a déjà répondu ci-dessous).
Vous devez vous connecter pour publier un commentaire.
Oui, je pense que vous avez déjà diagnostiqué le problème correctement. C'est un sale effet de côté, disons, sur la barre de défilement verticale, apparaissant et ayant besoin d'espace et la disposition des clients de plus petite superficie. Trop petit pour tenir les commandes, maintenant aussi de faire de la barre de défilement horizontale apparaît. Il est en fait bi-stable, la barre horizontale peut scintiller sur et en dehors, dans certains cas.
Pour éviter cet effet, le moteur de disposition aurait à faire plusieurs passages par le biais de la mise en page, de composer avec l'évolution de la zone client. Toutefois, elle ne fait une passe. Qui semble judicieux, cela pourrait être potentiellement sans fin de la boucle. Je ne sais pas d'une vie décente pour résoudre ce problème. Votre utilisateur sera probablement juste redimensionner la fenêtre assez grande pour se débarrasser d'au moins une des barres de défilement.
C'est un bogue connu dans windows - ici
Meilleure façon de résoudre ce problème est de mettre à la disposition de table de panneau autosized l'intérieur d'un autre panneau qui s'affiche à l'écran principal et définissez avec défilement automatique = true
De sorte que vous n'utilisez plus l'tablelayoutpanel pour faire défiler qui est buggé, vous utilisez le panneau de défilement et la tablelayoutpanel est à l'intérieur du panneau de
Je n'ai pas noté exactement le comportement que vous décrivez, mais dans des situations où l'apparence de la barre de défilement verticale rend une barre de défilement horizontale nécessaire.
Vous pouvez définir le contenu du panneau pour permettre à la largeur de la barre de défilement, par exemple si j'ai un
ListBox
dans unPanel
:HTH
Je viens de rencontré ce problème. Le correctif que j'ai utilisé était de définir
Scrollable
àfalse
puis àtrue
. Voici un exemple avec unListView
Resize
événement:Si
Scrollable
n'est pas toujours vrai, vous pouvez faire le recalcul conditionnelle.Alors que c'est une vieille question, c'est toujours un problème .NET 4. Après avoir lu autant que je pouvais trouver sur le sujet, j'ai roulé une combinaison de solutions au sein d'une classe d'aide.
Tout d'abord, voici le résultat que je suis en tournage pour ... j'ai un panneau qui contient une variété de contrôles. Les contrôles enfants, et de leur taille, peuvent changer en fonction de l'activité de l'utilisateur. Je veux que le panneau de redimensionner horizontalement de sorte qu'il n'y a jamais une barre de défilement horizontale, mais si il n'y a pas assez de place à la verticale, je veux que la barre de défilement verticale à apparaître. De plus, la barre de défilement verticale ne peut pas couvrir tout de mon enfant de contrôle quand il s'affiche, et je ne veux pas laisser un vide quand il n'est pas nécessaire.
Les deux 'bugs' qui ma classe helper tente de le résoudre sont d'abord, ne pas afficher la barre de défilement horizontale, et la deuxième, lorsque la barre de défilement verticale apparaît, ont le panneau de la largeur d'augmenter automatiquement à les accueillir.
Mes hypothèses sont que le panneau est fixé pour un redimensionnement automatique et Automatique, et l'enfant contrôles sont définis pour un redimensionnement automatique en tant que bien.
La Solution
La classe helper se fixe sur le panneau (par la manipulation de la Peinture et SizeChanged événements) et fait deux choses. Tout d'abord, il désactive la barre de défilement horizontale. Ce n'est pas aussi facile qu'il y paraît, et j'ai trouvé la solution à ce problème ici Barre de défilement horizontale réponse par Kbv Subrahmanyam. Deuxièmement, en réponse à la Peinture et SizeChanged événements, ainsi que d'un arrière-plan de la minuterie, il vérifie si la propriété Visible de la barre de défilement verticale a changé. Si oui, la classe helper modifie le Droit de la propriété Padding du panneau d'ajouter ou de supprimer de l'espace de la barre de défilement exige. L'utilisation des différentes panneau événements et la minuterie sont nécessaires car .NET expose pas des manifestations à tous pour la barre de défilement (un gros défaut de conception à mon humble avis).
Une fois le dernier point est que vous ne pouvez pas faire quelque chose qui change la taille du panneau lors de la manipulation du SizeChanged événement. Les mauvaises Choses(tm) se produit si vous le faites. Donc, si j'ai besoin de changer le rembourrage en raison d'un SizeChanged cas, je le calendrier de changement pour plus tard.
De toute façon, voici le code pour la classe helper. Il suppose que vous avez tous l '"aide" que les états, dont l'un pour le Système.Le filetage ...