2010-07-12 12 views
9

ho bisogno di sviluppare un controllo Label in WPF, sulla NET 3.5 e VisualStudio 2010, in cui il FontSize verrà automaticamente rendere il testo riempire l'area di controllo.WPF Label adattarsi FontSize alla sua larghezza e l'altezza

Non so se devo creare un CustomControl che eredita da Label o se devo creare un UserControl che contiene un controllo Label.

Ho visto un esempio qui utilizzando uno ValueConverter, ma non sto capendo il suo comportamento, qui: change font size dynamically.

Qualcuno può darmi un indizio su questo?

Aggiornamento:

ho trovato il Solutiion utilizzando il DoubleConverter dall'esempio che ho postato prima:

Il soultion sta usando una ValueConverter, che ho estratto dall'esempio, ma ha aggiunto il NumerFormat IFormatProvider per analizzare in modo corretto "0.1" del valore, ho scoperto che a 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(); 
    } 
} 

Poi, bisogna istanziare in XAML l'012.399., e specificare il legame nella FonSize Proprietà:

<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 è che il valore per ConverterParameter dipende assolutamente dal carattere assegnato. Ogni font può richiedere un valore diverso e devi "giocare" per ottenere il valore corretto per adattarsi esattamente.

+1

Beh ho finalmente uscire in questo modo e usati: Molto semplice ed efficace. – JoanComasFdz

+1

È necessario aggiungere la soluzione come risposta e contrassegnarla come corretta. –

risposta

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

Anche il lavoro.

+1

Non dimenticare che puoi anche usare StretchDirection per ridimensionare solo quando non si adatta ... ma lasciarlo da solo quando si adatta. – cplotts

+0

Mentre il trucco della viewbox funziona, ridimensiona anche il testo già visualizzato, che potrebbe non essere nitido come se fosse effettivamente sottoposto a rendering nella dimensione appropriata. – reuscam

+2

@reuscam: Non penso che sia il modo in cui funziona la viewbox. Non ridimensiona il contenuto già renderizzato, applica le trasformazioni che vengono utilizzate quando viene eseguito il rendering del contenuto. Almeno spero che lo faccia, perché fa parte del concetto di rendering di WPF. –

Problemi correlati