7 votes

Changez la taille de la police si le texte dépasse la limite du bloc de texte.

J'ai un bloc de texte avec une dimension de Largeur=511, Hauteur=159. Taille de la police = 28. Je souhaite modifier la taille de la police si le texte dépasse la dimension du bloc de texte afin que tout le texte soit affiché. Existe-t-il un moyen de le faire ? Une formule peut-être ?

2voto

Ariel Points 810

Cette solution implique l'utilisation d'une ViewBox, je pense qu'avec les fonctionnalités de transformation de Wpf il n'est pas nécessaire de changer la taille de la police du texte, Presque le même résultat peut être archivé en utilisant la transformation (et une ViewBox dans ce cas).

Au lieu de placer votre bloc de texte dans une boîte de visualisation, modifiez son modèle et placez le contrôle où le texte apparaît dans une boîte de visualisation, par exemple :

<ControlTemplate TargetType="{x:Type TextBox}">                     
    <Microsoft_Windows_Themes:ListBoxChrome x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" SnapsToDevicePixels="true">
        <Viewbox HorizontalAlignment="Left">
            <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
        </Viewbox>
    </Microsoft_Windows_Themes:ListBoxChrome>

    <ControlTemplate.Triggers>
        <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

Maintenant, vous avez un contrôle qui adapte son texte à l'espace disponible, merci à WPF.

Voici également quelques exemples

text example

0voto

Hassan Points 1043

Je ne suis pas vraiment sûr pour WPF, mais dans WinForms vous pourriez utiliser MeasureString pour mesurer les dimensions des chaînes dans une police donnée. Ainsi, chaque fois que le contenu du bloc de texte change, il suffit d'utiliser cette méthode et, si les dimensions du texte sont supérieures à celles du bloc de texte, de réduire la taille de la police et de mesurer à nouveau.

(maintenant, après avoir écrit ceci, je pense qu'il devrait y avoir une méthode plus simple pour cela)

0voto

ChP Points 266

Cela dépend de la police que vous utilisez. Par exemple, Courier New est conçu pour que chaque caractère ait la même largeur, donc si vous faites des recherches sur la largeur par caractère, vous pouvez utiliser la fonction get length pour la chaîne (qui vous donne la longueur en caractères) et à partir de là, calculer sa largeur en pixels. Si sa largeur dépasse 511px, vous ajustez la taille en conséquence.

Si vous utilisez une police différente, comme Arial, vous pouvez faire de même et, si vous voulez vraiment être précis, vous pouvez regrouper l'alphabet en lettres étroites, comme "i", "l", etc., en lettres moyennes, comme "t", en lettres grosses, comme "o", et en capitales. Ensuite, vous obtenez le nombre de lettres étroites, moyennes et grosses et vous calculez la taille à partir de ces données, mais personnellement, c'est trop pour moi.

J'espère que cela vous a été utile.

Edit : Ignorez celle-ci, je viens de lire sur la fonction measurestring, C'est un effort beaucoup plus petit que ma suggestion.

0voto

Josh Points 2857

Voici ce que j'ai trouvé. Assurez-vous de gérer le cas de la taille de police -1.0.

      private static double GetFontSize(TextBox textBox)
      {
         double fontSize = textBox.FontSize;
         FormattedText ft = new FormattedText(textBox.Text, CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight,
                                          new Typeface(textBox.FontFamily, textBox.FontStyle, textBox.FontWeight, textBox.FontStretch),
                                          fontSize, textBox.Foreground);
         while (textBox.Width < ft.Width)
         {
            fontSize -= 1;
            if (fontSize < 0) return -1.0;
            ft = new FormattedText(textBox.Text, CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight,
                                                      new Typeface(textBox.FontFamily, textBox.FontStyle, textBox.FontWeight, textBox.FontStretch),
                                                      fontSize, textBox.Foreground);
         }

         return fontSize;
      }

0voto

C.Evenhuis Points 10818

Edit : Je devrais regarder les balises avant de poster. Je n'ai aucune idée de ce que WPF pourrait offrir pour résoudre ce problème.

Je n'ai pas de preuve à l'appui, mais il semble que (également pour les polices à largeur variable, du moins toutes celles installées sur ma machine) :

  • La taille de la police a une relation linéaire avec la largeur d'une chaîne donnée.
  • La taille de la police 0 donne une largeur de 0

Cela signifie que vous pourriez probablement utiliser MeasureString une fois sur la plus grande taille de police autorisée, puis interpoler pour trouver la taille de police optimale.

Il y a cependant quelques "bosses de pixels" sur cette "route linéaire", de sorte que vous pouvez vous tromper de quelques pixels - mais c'est une bonne alternative aux boucles de mesure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X