2010-07-12 33 views
9

Necesito desarrollar un control Label en WPF, en .NET 3.5 y VisualStudio 2010, en la que el FontSize automáticamente hará que el texto llenar el área de control.WPF Etiqueta adaptarse Tamaño de Letra a su anchura y altura

No sé si debería crear un CustomControl heredando de Label o si debería crear un UserControl que contiene un control Label.

He visto un ejemplo aquí utilizando un ValueConverter, pero no estoy entendiendo su comportamiento, aquí: change font size dynamically.

¿Alguien puede darme una pista al respecto?

Actualización:

He encontrado el Solutiion utilizando el DoubleConverter del ejemplo que he publicado antes:

El soultion utiliza una ValueConverter, que extraje del ejemplo, pero agregó que el NumerFormat IFormatProvider analizar correctamente "0.1" el valor, me encontré con que en 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(); 
    } 
} 

Entonces, usted tiene que crear una instancia en XAML el DoubleConverter, y especifique la unión en FonSize propiedad:

<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> 

Un punto importante es que el valor de ConverterParameter depende absolutamente de la fuente asignada. Cada fuente puede necesitar un valor diferente y debe "jugar" para obtener el valor correcto que se ajuste exactamente.

+1

Bueno por fin dejar de esta manera y utilizada: Muy sencillo y eficaz. – JoanComasFdz

+1

Debe agregar su solución como respuesta y marcarla como correcta. –

Respuesta

27
<Viewbox> 
    <TextBlock>asd</TextBlock> 
</Viewbox> 

También hace el trabajo.

+1

No olvide que también puede usar StretchDirection para cambiar el tamaño cuando no encaja ... pero déjelo solo cuando encaje. – cplotts

+0

Mientras funciona el truco viewbox, también cambia el tamaño del texto ya renderizado, que puede no ser tan nítido como si realmente se procesara con el tamaño apropiado. – reuscam

+2

@reuscam: No creo que sea la forma en que funciona viewbox. No cambia el tamaño del contenido ya presentado, sino que aplica las transformaciones que se utilizan cuando se procesa el contenido. Al menos espero que lo haga, porque es parte del concepto de representación de WPF. –

Cuestiones relacionadas