Pergunta

Estou criando um controle WPF personalizado que digamos, por simplicidade, possui um painel de pilha vertical com um "título" de texto, seguido por um conteúdo. Quero que o tamanho da fonte para o "título" seja 5 pontos maiores que o tamanho usado no conteúdo, que é herdado por qualquer contêiner em que o usuário coloque esse controle.

Como posso especificar um tamanho de fonte no modelo de controle do elemento de cabeçalho usando um valor relativo sem expor uma propriedade como "titleFontSize" ao usuário? Eu quero fazer "Adicionar 5".

Tentei usar um scaletransform no bloco de texto do cabeçalho com resultados mistos (o bloco de texto em escala Fine, mas a orientação foi modificada - eu tinha o texto justificado e ele moveu a área "para fora do controle" quando escalada). Além disso, não tenho certeza se a transformação da escala seria apropriada aqui.

Foi útil?

Solução 2

Eu fiz isso com um IVALUECONVERTER da seguinte maneira:

Criou uma classe FontsizeConverter que deriva do IVALUECONVERTER. O método de convertido adiciona 10 ao valor e o método de convertback subtraia 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
}

Em seguida, declarei uma instância desta classe no modelo XAML para o controle:

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

E finalmente, a ligação do FontSize usa esse conversor aplicado à propriedade herdada do FontSize:

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

Isso funciona. Mas ainda não sei se essa é a resposta correta. Deixe -me saber se houver uma maneira melhor, ou se isso for apropriado.

Outras dicas

Uma maneira mais genérica

Conversor de valor

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

Recurso do conversor

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

Xaml

<TextBlock FontSize="{Binding
                     RelativeSource={RelativeSource AncestorType={x:Type Window}},
                     Path=FontSize,
                     Converter={StaticResource MathConverter},
                     ConverterParameter=2}" />
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top