2011-09-29 7 views
5

No es raro para mí escribir algo como a continuación para diseñar un formulario de entrada de datos, pero mi problema es que TextBox y TextBlock no parecen implementar los Setters que están en el BaseElementStyle. Por lo general, necesito definirlos por separado.¿Por qué mi TextBlock/TextBox no aplica valores de un estilo base?

¿Por qué es esto? ¿Y hay una forma de evitarlo?

Supongo que tiene que ver con el hecho de que se suelen utilizar en otras plantillas de control (por se utiliza ejemplo TextBlock en la mayoría de los controles y el cuadro de texto se utiliza en datepickers y ComboBoxes)

<Style x:Key="BaseElementStyle" TargetType="{x:Type FrameworkElement}"> 
    <Setter Property="Margin" Value="5" /> 
    <Setter Property="VerticalAlignment" Value="Center" /> 
</Style> 
<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource BaseElementStyle}" /> 
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource BaseElementStyle}" /> 
<Style TargetType="{x:Type Label}" BasedOn="{StaticResource BaseElementStyle}" /> 
<Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource BaseElementStyle}" /> 
<Style TargetType="{x:Type DatePicker}" BasedOn="{StaticResource BaseElementStyle}" /> 
<Style TargetType="{x:Type CheckBox}" BasedOn="{StaticResource BaseElementStyle}" /> 

Respuesta

8

me gustaría sugerir las dos soluciones posibles. Parece que cada uno de Key y Type se puede usar, pero no se pueden usar juntos como su caso de pregunta, x:Key="BaseElementStyle" TargetType="{x:Type FrameworkElement}".

  1. usando x: Key

    <Style x:Key="BaseElementStyle"> 
        <Setter Property="FrameworkElement.Margin" Value="5" /> 
        <Setter Property="FrameworkElement.VerticalAlignment" Value="Center" /> 
    </Style> 
    <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource BaseElementStyle}" /> 
    <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource BaseElementStyle}" /> 
    <Style TargetType="{x:Type Label}" BasedOn="{StaticResource BaseElementStyle}" /> 
    <Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource BaseElementStyle}" /> 
    <Style TargetType="{x:Type DatePicker}" BasedOn="{StaticResource BaseElementStyle}" /> 
    <Style TargetType="{x:Type CheckBox}" BasedOn="{StaticResource BaseElementStyle}" /> 
    
  2. usando x: Tipo

    <Style TargetType="{x:Type FrameworkElement}"> 
        <Setter Property="Margin" Value="5" /> 
        <Setter Property="VerticalAlignment" Value="Center" /> 
    </Style> 
    <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 
    <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 
    <Style TargetType="{x:Type Label}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 
    <Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 
    <Style TargetType="{x:Type DatePicker}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 
    <Style TargetType="{x:Type CheckBox}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 
    
+0

Gracias! Y me enseñaste algo nuevo ... No sabía que podrías basar un estilo en un estilo implícito como el que muestra en el n. ° 2. ¡Muy bueno saber! – Rachel

7

También hay que tener en cuenta que WPF considera un ControlTemplate a ser un límite inflación y hace NO aplica estilos predeterminados dentro de las plantillas. La excepción a la regla: cualquier cosa que herede de ControlSERÁ inflada con el estilo predeterminado. Dado que TextBlock hereda de FrameworkElement y no de Control, si lo usa dentro de ControlTemplate, también deberá aplicar su estilo manualmente. Esto es cierto tanto para TextBlocks que se agregan a mano como para TextBlocks agregados por WPF para la cadena Content. Un ejemplo rápido:

<Window x:Class="ImplicitStyles.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel> 
     <StackPanel.Resources> 
      <Style x:Key="BaseElementStyle"> 
       <Setter Property="FrameworkElement.Tag" Value="Hello World" /> 
      </Style> 
      <Style TargetType="{x:Type Button}" BasedOn="{StaticResource BaseElementStyle}" /> 
      <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource BaseElementStyle}" /> 

      <!-- Default style for TextBlock will not be applied, Tag will be null --> 
      <ControlTemplate x:Key="MyContentControlTemplateOne" TargetType="{x:Type ContentControl}"> 
       <Border BorderBrush="Red" BorderThickness="2"> 
        <TextBlock Text="{Binding RelativeSource={RelativeSource Self}, Path=Tag}" /> 
       </Border> 
      </ControlTemplate> 

      <!-- Default style for Button will be applied, Tag will be Hello World -->  
      <ControlTemplate x:Key="MyContentControlTemplateTwo" TargetType="{x:Type ContentControl}"> 
       <Border BorderBrush="Red" BorderThickness="2"> 
        <Button Content="{Binding RelativeSource={RelativeSource Self}, Path=Tag}" /> 
       </Border> 
      </ControlTemplate> 

     </StackPanel.Resources> 

     <ContentControl Template="{StaticResource MyContentControlTemplateOne}" /> 
     <ContentControl Template="{StaticResource MyContentControlTemplateTwo}" /> 
    </StackPanel> 

</Window> 

Para obtener más información, consulte esta entrada del blog:

http://blogs.msdn.com/b/wpfsdk/archive/2009/08/27/implicit-styles-templates-controls-and-frameworkelements.aspx

+1

Gracias, no me di cuenta de que las plantillas eran los límites de la herencia de estilo. Me preguntaba por qué TextBlocks dentro de DataTemplates no obtenían el mismo estilo aplicado – Rachel

Cuestiones relacionadas