6 Stimmen

Wpf benutzerdefinierte Steuerung Vorlage - relative Schriftgröße

Ich bin ein benutzerdefiniertes WPF-Steuerelement erstellen, die sagen wir der Einfachheit halber hat eine vertikale Stapel-Panel mit einem "Titel" TextBlock, gefolgt von einem ContentPresenter. Ich möchte die Schriftgröße für den "Titel" um 5 Punkte größer als die Größe in den Inhalt verwendet werden, die von was auch immer Container der Benutzer dieses Steuerelement in platziert geerbt wird.

Wie kann ich eine Schriftgröße in der Steuervorlage für das Kopfzeilenelement mit einem relativen Wert angeben, ohne eine Eigenschaft wie "TitleFontSize" für den Benutzer freizugeben? Ich möchte "add 5" machen.

Ich habe versucht, mit einem ScaleTransform auf der Kopfzeile Textblock mit gemischten Ergebnissen (der Textblock skaliert gut, aber die Ausrichtung wurde geändert - ich hatte den Text rechtsbündig und es verschoben "aus der Steuerung" Bereich, wenn skaliert). Außerdem bin ich nicht sicher, ob scale transform hier angemessen wäre.

14voto

Thomas Punkte 785

Ein allgemeinerer Weg

Wertkonverter

public class MathConverter : IValueConverter
{
    public object Convert( object value, Type targetType, object parameter, CultureInfo culture )
    {
        return (double)value + double.Parse( parameter.ToString() );
    }

    public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
    {
        return null;
    }
}

Konverter Ressource

<my:MathConverter x:Key="MathConverter" />

XAML

<TextBlock FontSize="{Binding
                     RelativeSource={RelativeSource AncestorType={x:Type Window}},
                     Path=FontSize,
                     Converter={StaticResource MathConverter},
                     ConverterParameter=2}" />

5voto

Bill Punkte 2291

Ich habe es mit einem IValueConverter wie folgt gemacht:

Eine Klasse FontSizeConverter erstellt, die von IValueConverter abgeleitet ist. Die Convert-Methode addiert 10 zu dem Wert, und die ConvertBack-Methode subtrahiert 10.

public class FontSizeConverter : IValueConverter
{

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (double)value + 12.0;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (double)value - 12.0;
    }

    #endregion
}

Als nächstes habe ich eine Instanz dieser Klasse in der XAML-Vorlage für das Steuerelement deklariert:

<Style.Resources>
        <local:FontSizeConverter x:Key="fontSizeConverter"/>
</Style.Resources>

Und schließlich verwendet die FontSize-Bindung diesen Konverter, der auf die geerbte FontSize-Eigenschaft angewendet wird:

<TextBlock FontSize="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=FontSize, Converter={StaticResource fontSizeConverter}}" 
                                   Grid.Row="0" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, 
                                   Path=Date.Day}" HorizontalAlignment="Right" VerticalAlignment="Top" Padding="2" Margin="2" >
 </TextBlock>

Das funktioniert. Aber ich weiß immer noch nicht, ob dies die richtige Antwort ist. Lassen Sie mich wissen, ob es einen besseren Weg gibt, oder ob dies angemessen ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X