2010-07-12 16 views
9

Je dois développer un contrôle Label dans WPF, sur .NET 3.5 et VisualStudio 2010, dans lequel le FontSize fera automatiquement le texte de remplir la zone de contrôle.WPF Étiquette adapter FontSize à sa largeur et la hauteur

Je ne sais pas si je devrais créer un CustomControl héritant de Label ou si je dois créer un UserControl qui contient un contrôle Label. J'ai vu un exemple ici en utilisant un ValueConverter, mais je ne comprends pas son comportement, ici: change font size dynamically.

Quelqu'un peut-il me donner une idée à ce sujet?

Mise à jour:

J'ai trouvé le solutiion en utilisant le DoubleConverter de l'exemple que j'ai posté avant:

Le soultion utilise un ValueConverter, que j'extrait de l'exemple, mais il a ajouté le NumerFormat IFormatProvider pour analyser correctement la valeur « 0.1 », je trouve que, à 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(); 
    } 
} 

, vous devez ensuite instancier en XAML le DoubleConverter, et préciser la liaison dans la propriété FonSize:

<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 point important est que la valeur de ConverterParameter dépend absolument de la police affectée. Chaque police peut avoir besoin d'une valeur différente et vous devez "jouer" pour obtenir la valeur correcte pour s'adapter exactement.

+1

Eh bien, je enfin quitter cette façon et utilisé: est très simple et efficace. – JoanComasFdz

+1

Vous devez ajouter votre solution comme réponse et la marquer comme correcte. –

Répondre

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

Fait aussi le travail.

+1

N'oubliez pas que vous pouvez également utiliser StretchDirection pour ne redimensionner que lorsque cela ne convient pas ... mais laissez-le tranquille quand cela vous convient. – cplotts

+0

Bien que le truc de la boîte de vue fonctionne, il redimensionne également le texte déjà rendu, qui peut ne pas être aussi net que s'il était réellement rendu à la taille appropriée. – reuscam

+2

@reuscam: Je ne pense pas que c'est la façon dont la viewbox fonctionne. Il ne redimensionne pas le contenu déjà rendu, il applique les transformations utilisées lors du rendu du contenu. Au moins, j'espère que c'est le cas, car cela fait partie du concept de rendu de WPF. –

Questions connexes