2008-11-22 12 views
6

Ich erstelle ein benutzerdefiniertes WPF-Steuerelement, sagen wir der Einfachheit halber hat eine vertikale Stack-Panel mit einem "Titel" TextBlock, gefolgt von einem ContentPresenter. Ich möchte, dass die Schriftgröße für den "Titel" 5 Punkte größer als die im Inhalt verwendete Größe ist, die von dem Container geerbt wird, in dem der Benutzer das Steuerelement platziert.Wpf benutzerdefinierte Steuerelement Vorlage - relative Schriftgröße

Wie kann ich eine Schriftgröße im Steuerelement angeben Vorlage für das Kopfzeilenelement, das einen relativen Wert verwendet, ohne dem Benutzer eine Eigenschaft wie "TitleFontSize" zur Verfügung zu stellen? Ich möchte "add 5" hinzufügen.

Ich habe versucht, eine ScaleTransform auf den Header-Textblock mit gemischten Ergebnissen (der Textblock skaliert fein, aber die Ausrichtung wurde geändert - Ich hatte den Text rechtsbündig und es bewegte sich "außerhalb der Kontrolle" Bereich skaliert). Ich bin mir auch nicht sicher, ob die Maßstabsumwandlung hier angebracht wäre.

Antwort

5

ich mit einem IValueConverter tat es wie folgt:

eine Klasse FontSizeConverter Erstellt, die von IValueConverter ableitet. Die Methode Konvertieren 10 auf den Wert addiert, 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 declaried ich eine Instanz dieser Klasse in der XAML-Vorlage für das Steuerelement:

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

Und Finnaly, Die FontSize-Bindung verwendet diesen Konverter, der auf die geerbte FontSize-Eigenschaft angewendet wird:

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

+0

Sieht gut aus, die einzige Änderung, die ich vornehmen würde, ist, den Wert, der FontSize hinzugefügt wird, durch den ConverterParameter zu übergeben, anstatt ihn im Konverter hart zu codieren. –

+0

Wie Ian sagte, würde ich einen ConverterParameter hinzufügen, aber ansonsten sieht das gut aus. – Donnelle

+0

Ich habe diese Lösung versucht und es hat absolut nichts gemacht. Der Wertkonverter wird nie aufgerufen. – cppguy

13

Eine generische Art und Weise

Werteumwandler

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

Converter Ressourcen

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

XAML

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

Ich würde tatsächlich einen kleinen Schritt weiter gehen und es verwenden Multiplikation gegen eine Skala (entweder 0.0-1.0 oder 0-100%). Auf diese Weise ist es eine "wahre" relative Größe. Wenn die Schriftgröße 20 beträgt und Sie 10 subtrahieren, ergibt dies eine Größe von 10 oder 50%. Aber wenn Sie bei 40 sind und 10 subtrahieren, sind Sie nur bei 30 oder 75% Größe. Mit einem Skalierungswert können Sie immer Größenverhältnisse beibehalten. – MarqueIV

+3

So viel Code für solch einen trivialen Effekt ... Stimmt etwas mit dem WPF überhaupt nicht? – Califf