2008-11-22 12 views
6

Estoy creando un control WPF personalizado que, por simplicidad, tiene un panel de pila vertical con un TextBlock "de título", seguido de un ContentPresenter. Quiero que el tamaño de fuente para el "título" sea 5 puntos MAYOR que el tamaño utilizado en el contenido, que se hereda en cualquier contenedor en el que el usuario coloque este control.Wpf plantilla de control personalizado - tamaño de fuente relativo

¿Cómo puedo especificar un tamaño de fuente en el control? plantilla para el elemento de encabezado usando un valor relativo sin exponer una propiedad como "TitleFontSize" al usuario? Quiero hacer "agregar 5".

Intenté usar ScaleTransform en el bloque de texto del encabezado con resultados mixtos (el bloque de texto se escalo bien pero la orientación se modificó - Tenía el texto justificado a la derecha y movió el área "fuera del control" al escalar). Además, no estoy seguro de si la transformación de escala sería adecuada aquí.

Respuesta

5

lo hice con un IValueConverter de la siguiente manera:

Creado FontSizeConverter una clase que deriva de IValueConverter. El método Convert añade 10 al valor, y el método ConvertBack resta 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 
} 

A continuación, declaried una instancia de esta clase en la plantilla XAML para el control:

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

Y Finnaly, el enlace FontSize utiliza este convertidor aplicado a la propiedad FontSize heredada:

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

Esto funciona. Pero todavía no sé si esta es la respuesta correcta. Avíseme si hay una mejor manera, o si es apropiado.

+0

Me parece bien, el único cambio que haría es pasar el valor que se está agregando a FontSize a través del parámetro Converter, en lugar de codificarlo en el convertidor. –

+0

Como dijo Ian, agregaría un ConvertidorParámetro pero, por lo demás, eso se ve bien. – Donnelle

+0

Intenté esta solución y no hizo absolutamente nada. El convertidor de valor nunca recibe una llamada. – cppguy

13

Una forma más genérica

convertidor de valores

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

Recursos Convertidor

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

XAML

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

De hecho, daría un pequeño paso más y usaría la multiplicación en una escala (ya sea 0.0-1.0 o 0-100%). De esta forma es un tamaño relativo 'verdadero'. Después de todo, si el tamaño de la fuente es 20 y está restando 10, eso produce 10 o 50% de tamaño. Pero si tiene 40 y resta 10, solo tiene 30 o 75% de tamaño. Usando un valor de escala, siempre puede mantener las proporciones de tamaño. – MarqueIV

+3

Tanto código para un efecto tan trivial ... ¿Hay algún problema con el WPF en general? – Califf

Cuestiones relacionadas