Intro: Il y a beaucoup de commentaires qui disent "WinForms n'est pas auto-échelle pour les DPI/paramètres de police; passer à WPF." Cependant, je pense que c'est basé sur .NET 1.1; il semble qu'ils ont fait un très bon travail de mise en œuvre de l'auto-scaling .NET 2.0. Au moins basées sur nos recherches et de tests jusqu'à présent. Cependant, si certains d'entre vous connaissent mieux, nous aimerions entendre parler de vous. (S'il vous plaît ne vous embêtez pas à argumenter, nous devrions passer à WPF... ce n'est pas une option à l'heure actuelle.)
Questions:
Ce qui en WinForms n'est PAS auto-échelle correctement et par conséquent devrait être évitée?
Ce que les lignes directrices de conception devrait programmeurs suivre lors de la rédaction de WinForms code tel qu'il s'auto-échelle?
Les lignes Directrices de conception que nous avons identifiés à ce jour:
Tous les ContainerControls doivent être réglés sur le même
AutoScaleMode = Font
. (Police va gérer à la fois des DPI et de modifications pour le système de la police réglage de la taille; DPI ne traitera que les DPI des changements, pas de changements à la système de paramètre de taille de police.)Tous les ContainerControls doit également être défini avec
AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
, en supposant 96 ppp (voir la balle suivante). Et qui est auto-ajouté par le designer basé sur le DPI vous ouvrez le concepteur... mais manquait de beaucoup de nos plus ancien concepteur de fichiers. Peut-Être Que Visual Studio .NET (la version avant de VS 2005) n'a pas été en ajoutant que dans les correctement.Faire tout votre travail designer en 96 ppp (nous pourrions être en mesure de passer à 120 ppp; mais la sagesse sur l'internet dit de coller à 96 ppp; l'expérimentation est en ordre; de par sa conception, il ne devrait pas question qu'elle change juste l'
AutoScaleDimensions
ligne que le concepteur inserts).Assurez-vous de ne jamais mettre la Police au niveau du conteneur... seulement sur le feuille de contrôle. (Réglage de la Police sur un Conteneur semble s'éteindre la fonction d'auto-mise à l'échelle de ce conteneur.)
Ne PAS utiliser d'Ancrage
Right
ouBottom
ancré à un UserControl... positionnement automatique de l'échelle; au lieu de cela, la chute d'un Panneau ou d'autres récipient dans votre UserControl et d'Ancrer vos autres Contrôles ce Panneau; utilisation du Panneau de contrôle QuaiRight
ou DockBottom
dans votre UserControl.Seuls les contrôles dans les listes de Contrôles lors de l'
ResumeLayout
à la fin d'InitializeComponent
est appelé sera automatiquement mis à l'échelle... si vous ajouter dynamiquement des contrôles, alors vous avez besoin d'SuspendLayout();
AutoScaleDimensions = new SizeF(6F, 13F);
AutoScaleMode = AutoScaleMode.Font;
ResumeLayout();
sur cette commande avant de l'ajouter dans. Et votre positionnement aurez aussi besoin d'être ajustée, si vous n'êtes pas à l'aide de Quai modes ou un Gestionnaire de Mise en page commeFlowLayoutPanel
ouTableLayoutPanel
.Base de classes dérivées
ContainerControl
devrait quitterAutoScaleMode
ensemble deInherit
(la valeur par défaut définie dans la classeContainerControl
; mais PAS la valeur par défaut définie par le concepteur). Si vous le réglez à autre chose, et puis votre classe dérivée essaie de le mettre à la Police (comme il se doit), puis la loi du paramètre d'Font
va effacer le concepteur du réglage de l'AutoScaleDimensions
, résultant de la désactivation de l'auto-scaling! (Cette directive est combiné avec l'avant un signifie que vous ne pouvez jamais instancier des classes de base dans un concepteur... toutes les classes doivent être conçus comme des classes de base ou en tant que feuille de classes!)Évitez d'utiliser des
Form.MaxSize
statiquement / dans le Concepteur.MinSize
etMaxSize
sur le Formulaire ne s'adaptent pas aussi bien que tout le reste. Donc, si vous faites tout votre travail à 96 ppp, alors quand en plus le DPI votreMinSize
ne cause pas de problèmes, mais peut-être pas aussi restrictive que tu attendais, mais votreMaxSize
peut limiter votre Taille de la mise à l'échelle, ce qui peut causer des problèmes. Si vous souhaitezMinSize == Size == MaxSize
, ne pas le faire dans le Concepteur de... le faire dans le constructeur ou l'OnLoad
remplacer... définir à la foisMinSize
etMaxSize
de votre correctement sur l'échelle de Taille.Tous les Contrôles sur un particulier
Panel
ouContainer
utilisez l'Ancrage ou d'Amarrage. Si vous les mélangez, l'auto-scaling fait par l'Panel
souvent en mal de subtile façon bizarre.
Sont un de ces incorrecte ou inadéquate? Autres lignes directrices que nous devrions adopter? Existe-il d'autres modèles qui doivent être évités? Toutes les autres lignes directrices sur ce serait très apprécié.