Modelo de controle personalizado WPF - tamanho da fonte relativa
-
10-07-2019 - |
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.
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}" />