2010-11-26 19 views
7

Bueno tengo mi eso es Styles.xaml archivo fusionado en el Application.xaml por lo que se aplica a cada cosa ..WPF Cambiar fuente ¿El tamaño del botón con estilo falla?

aquí son mis estilos

<Style TargetType="{x:Type Control}" x:Key="baseStyle"> 
    <Setter Property="FontFamily" Value="Verdana"/> 
    <Setter Property="FontSize" Value="12"/> 
</Style> 

<Style TargetType="Button" BasedOn="{StaticResource baseStyle}"> 
    <Setter Property="Margin" Value="2,0,2,0"/> 
    <Setter Property="Padding" Value="2"/> 
    <Setter Property="FontSize" Value="50"/> 
</Style> 

<Style TargetType="TextBlock"> 
    <Setter Property="FontFamily" Value="Verdana"/> 
    <Setter Property="FontSize" Value="12"/> 
</Style> 

Cuando estoy en el editor de esto parece funcionar, pero cuando ejecuto la aplicación, el tamaño de fuente de los botones se reduce a sus tamaños normales ...

Supongo que los botones crean un TextBlock cuando su contenido se establece en una cadena y luego usan el estilo de bloque de texto ... pero ¿Cómo puedo anular esto?

Respuesta

0

Probé tus estilos, y funciona bien. Entonces tus estilos no son el problema. Creo que es el lugar donde fusionaste el estilo mientras escribías. Es mejor que coloque su ResourceDictionary Styles.xaml en su archivo MainWindow en lugar de su Application.xaml.

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <Window.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Styles.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Window.Resources> 

    <StackPanel> 
     <TextBlock>TTT</TextBlock> 
     <Button>BBB</Button> 
    </StackPanel> 
</Window> 

Pero el problema sigue sin estar claro, si no es la solución podría aclarar un poco más el modo de usar sus estilos mediante la publicación de esta parte de su código?

8

Tienes razón en

Mi suposición es que los botones crean un TextBlock cuando su contenido se establece en una cadena y luego use el bloque de texto estilo

. Ver la publicación this.

Una solución consiste en definir un DataTemplate para System.String, donde podemos utilizar explícitamente un TextBlock por defecto para mostrar el contenido. Usted puede colocar que DataTemplate en el mismo diccionario se define el estilo TextBlock para que este DataTemplate se aplicará a lo ContentPresenter efectuará mediante su estilo.

por lo que añadir el DataTemplate al final de Styles.xaml se solucionará el problema

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
    <Style TargetType="{x:Type Control}" x:Key="baseStyle"> 
     <Setter Property="FontFamily" Value="Verdana"/> 
     <Setter Property="FontSize" Value="12"/> 
    </Style> 

    <Style TargetType="{x:Type Button}" BasedOn="{StaticResource baseStyle}"> 
     <Setter Property="Margin" Value="2,0,2,0"/> 
     <Setter Property="Padding" Value="2"/> 
     <Setter Property="Foreground" Value="Red" /> 
     <Setter Property="FontSize" Value="50"/> 
    </Style> 

    <Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="FontFamily" Value="Verdana"/> 
     <Setter Property="Foreground" Value="Green" /> 
     <Setter Property="FontSize" Value="24"/> 
    </Style> 

    <DataTemplate DataType="{x:Type sys:String}"> 
     <TextBlock Text="{Binding}"> 
      <TextBlock.Resources> 
       <Style TargetType="{x:Type TextBlock}"/> 
      </TextBlock.Resources> 
     </TextBlock> 
    </DataTemplate> 
</ResourceDictionary> 

Esto mantendrá su estilo para un TextBlock pero el TextBlock creado en un botón, por ejemplo, no será efectuado por él

+1

Ojalá pudiera votar esta vez más. Pasé horas con otro desarrollador tratando de resolver esto. ¡Gracias! – Morinar

+0

¿Hay algún "inconveniente" con esta solución? Por ejemplo, si desea que los estilos se apliquen solo a TextBlocks en Butttons y no a todos los demás TextBlocks? – matrixugly

Cuestiones relacionadas