WPF Label adapt FontSize to it's Width and Height

20,203
<Viewbox>
    <TextBlock>asd</TextBlock>
</Viewbox>

Also does the job.

Share:
20,203
JoanComasFdz
Author by

JoanComasFdz

BS Computer Science @ EPSEVG (UPC BarcelonaTech) .NET C#, WPF / SL, WCF, TDD, DDD. SOreadytohelp

Updated on April 30, 2020

Comments

  • JoanComasFdz
    JoanComasFdz about 4 years

    I need to develop a Label control in WPF, on .NET 3.5 and VisualStudio 2010, in which the FontSize will automatically make the text fill the control area.

    I don't know if I should create a CustomControl inheriting from Label or if I should create a UserControl which contains a Label control.

    I've seen an example here using a ValueConverter, but I'm not understanding its behavior, here: change font size dynamically.

    Can anyone give me a clue about that?

    Update:

    I found the solutiion using the DoubleConverter from the example I've posted before:

    The soultion is using a ValueConverter, which I extracted from the example, but added the NumerFormat IFormatProvider to correctly parse "0.1" value, I found that at Decimal d1 = Decimal.Parse("0.1"); // = 1?!?:

     [ValueConversion(typeof(object), typeof(double))]
     public class DoubleConverter : IValueConverter
     {
      public object Convert(object value, Type targetType,
       object parameter, CultureInfo culture)
      {
       double dblValue = (double)value;
       double scale = Double.Parse(((string)parameter), System.Globalization.CultureInfo.InvariantCulture.NumberFormat);
       return dblValue * scale;
      }
    
      public object ConvertBack(object value, Type targetType,
       object parameter, CultureInfo culture)
      {
       throw new NotImplementedException();
      }
     }
    

    Then, you have to instantiate in XAML the DoubleConverter, and specify the binding in the FonSize Property:

    <UserControl x:Class="<Namespace>.LabelAutoFontSize"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:me="clr-namespace:<Namespace>"
      mc:Ignorable="d" 
      d:DesignHeight="60" d:DesignWidth="278">
     <UserControl.Resources>
     <me:DoubleConverter x:Key="doubleConverter" />
     </UserControl.Resources>
     <Grid>
     <Label
      x:Name="lbl"
      FontSize="{
       Binding Path=Width,
        RelativeSource={RelativeSource AncestorType={x:Type UserControl}},
       Converter={StaticResource doubleConverter},
       ConverterParameter=0.116}"
    
      VerticalAlignment="Stretch"
      HorizontalAlignment="Stretch"
      Content="LabelAutoFontSize"
      d:LayoutOverrides="Width"
      HorizontalContentAlignment="Center"
      VerticalContentAlignment="Center" />
     </Grid>
    </UserControl>
    

    An important point is that the value for ConverterParameter depends absolutely from the font assigned. Each font may need a different value and you have to "play around" to get the correct value to fit exactly.

  • cplotts
    cplotts over 12 years
    Don't forget that you can also use StretchDirection to only resize down when it doesn't fit ... but leave it alone when it does fit.
  • reuscam
    reuscam about 11 years
    While the viewbox trick works, it also resizes already rendered text, which may not be as sharp as if it were actually rendered to the appropriate size.
  • Alex Maker
    Alex Maker almost 11 years
    @reuscam: I don't think it's the way the viewbox works. It doesn't resize already rendered content, it applies transformations that are used when the content is rendered. At least I hope it does so, because it's part of WPF's rendering concept.