2008-11-22 8 views
6

Je crée un contrôle WPF personnalisé qui, pour simplifier, a un panneau de pile vertical avec un TextBlock "title", suivi d'un ContentPresenter. Je veux que la taille de police pour le "titre" soit 5 points plus GRANDE que la taille utilisée dans le contenu, qui est héritée par le conteneur dans lequel l'utilisateur place ce contrôle.Modèle de contrôle personnalisé Wpf - taille de police relative

Comment puis-je spécifier une taille de police dans le contrôle modèle pour l'élément d'en-tête en utilisant une valeur relative sans exposer une propriété comme "TitleFontSize" à l'utilisateur? Je veux faire "ajouter 5". J'ai essayé d'utiliser un ScaleTransform sur le bloc de texte d'en-tête avec des résultats mitigés (le bloc de texte a bien été mis à l'échelle mais l'orientation a été modifiée - le texte était justifié et déplacé). En outre, je ne suis pas sûr si la transformation d'échelle serait approprite ici.

Répondre

5

Je l'ai fait avec un IValueConverter comme suit:

créé un FontSizeConverter de classe qui dérive de IValueConverter. La méthode Convert ajoute 10 à la valeur et la méthode de ConvertBack retranche 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 
} 

Ensuite, je declaried une instance de cette classe dans le modèle XAML pour le contrôle:

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

Et finnaly, la liaison FontSize utilise ce convertisseur appliqué à la propriété FontSize héritée:

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

Cela fonctionne. Mais je ne sais toujours pas si c'est la bonne réponse. Faites-moi savoir s'il y a un meilleur moyen, ou si c'est approprié.

+0

Cela me semble bon, le seul changement que je ferais est de passer la valeur qui est ajoutée à FontSize via le ConverterParameter, plutôt que de le coder en dur dans le convertisseur. –

+0

Comme Ian l'a dit, j'ajouterais un ConverterParameter, mais sinon ça a l'air bien. – Donnelle

+0

J'ai essayé cette solution et elle n'a absolument rien fait. Le convertisseur de valeur n'est jamais appelé. – cppguy

13

Une façon plus générique

Convertisseur de valeur

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 ressources

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

XAML

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

Je ferais en fait un petit pas plus loin et lui ferais utiliser la multiplication contre une échelle (soit 0.0-1.0 ou 0-100%). De cette façon, il s'agit d'une «vraie» taille relative. Après tout, si la taille de la police est de 20 et que vous soustrayez 10, cela donne une taille de 10 ou 50%. Mais si vous avez 40 ans et soustrayez 10, vous n'avez que 30 ou 75% de taille. En utilisant une valeur d'échelle, vous pouvez toujours conserver des proportions de taille. – MarqueIV

+3

Tant de code pour un tel effet trivial ... Quelque chose ne va pas avec le WPF en général? – Califf

Questions connexes