WPF Label adapt FontSize to it's Width and Height
<Viewbox>
<TextBlock>asd</TextBlock>
</Viewbox>
Also does the job.
JoanComasFdz
BS Computer Science @ EPSEVG (UPC BarcelonaTech) .NET C#, WPF / SL, WCF, TDD, DDD. SOreadytohelp
Updated on April 30, 2020Comments
-
JoanComasFdz about 4 years
I need to develop a
Label
control in WPF, on .NET 3.5 and VisualStudio 2010, in which theFontSize
will automatically make the text fill the control area.I don't know if I should create a
CustomControl
inheriting fromLabel
or if I should create aUserControl
which contains aLabel
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 theFonSize
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 over 12 yearsDon'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 about 11 yearsWhile 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 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.