2012-06-16 13 views
6

El xaml para el primer estilo funciona como yo quiero, produciendo un botón con un glifo Wingding utilizando setters para diseñar el contenido y sus propiedades. La segunda versión de este estilo intenta hacer lo mismo pero con una plantilla de datos para el contenido, pero solo muestra el tipo de una plantilla de datos (es decir, System.Windows.DataTemplate).Contenido de estilo mediante setters v ContentTemplate

  1. ¿Por qué la segunda versión no muestra el mismo contenido que la 1ra?
  2. Suponiendo que la solución es trivial, ¿una de las versiones del estilo sería preferible a la otra por cualquier motivo más allá de las preferencias personales?

NOTA: estoy mostrando los enlaces y desencadena en caso de que haya algo allí que está afectando el contenido, pero es sólo la primera parte del estilo que varía

Cheers,
Berryl

Style 1

Muestra: enter image description here

<Style x:Key="EditCommandButtonStyle" TargetType="{x:Type Button}" > 
    <Setter Property="Content" Value="a" /> 
    <Setter Property="Foreground" Value="Navy" /> 
    <Setter Property="FontFamily" Value="Wingdings 3" /> 
    <Setter Property="FontWeight" Value="Bold" /> 
    <Setter Property="FontSize" Value="18" /> 
    <Setter Property="Width" Value="30" /> 
    <Setter Property="Height" Value="Auto" /> 

    <!--What makes it an Edit button--> 
    <Setter Property="Command" Value="{Binding ActivateThisSatelliteVmCommand}"/> 
    <Setter Property="ToolTip"> 
     <Setter.Value> 
      <TextBlock> 
       <TextBlock.Text> 
        <Binding Path="HeaderLabel" StringFormat="{resx:Resx ResxName=Smack.Core.Presentation.Resources.MasterDetail, Key=Item_Edit_Label}"/> 
       </TextBlock.Text> 
      </TextBlock> 
     </Setter.Value> 
    </Setter> 

    <!-- WHen its available --> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border x:Name="theBorder" CornerRadius="4"> 
        <ContentPresenter x:Name="theContent" VerticalAlignment="Center" HorizontalAlignment="Center" /> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="False"> 
         <Setter TargetName="theContent" Property="Visibility" Value="Hidden"/> 
         <Setter TargetName="theBorder" Property="Background" Value="Transparent"/> 
        </Trigger> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter TargetName="theContent" Property="Visibility" Value="Visible"/> 
        </Trigger> 
        <Trigger Property="IsPressed" Value="True"> 
         <Setter TargetName="theContent" Property="Visibility" Value="Visible"/> 
         <Setter TargetName="theBorder" Property="Background" Value="Orange"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

estilo 2

Muestra "System.Windows.DataTemplate"

<Style x:Key="EditCommandButtonStyle" TargetType="{x:Type Button}" > 
    <Setter Property="Content"> 
     <Setter.Value> 
      <DataTemplate> 
       <TextBlock Text="a" FontFamily="Wingdings 3" FontWeight="Bold" FontSize="18" Foreground="Navy" /> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 

    <!--What makes it an Edit button--> 
    <Setter Property="Command" Value="{Binding ActivateThisSatelliteVmCommand}"/> 
    <Setter Property="ToolTip"> 
     <Setter.Value> 
      <TextBlock> 
       <TextBlock.Text> 
        <Binding Path="HeaderLabel" StringFormat="{resx:Resx ResxName=Core.Presentation.Resources.MasterDetail, Key=Item_Edit_Label}"/> 
       </TextBlock.Text> 
      </TextBlock> 
     </Setter.Value> 
    </Setter> 

    <!-- When its available --> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border x:Name="theBorder" CornerRadius="4"> 
        <ContentPresenter x:Name="theContent" VerticalAlignment="Center" HorizontalAlignment="Center" /> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="False"> 
         <Setter TargetName="theContent" Property="Visibility" Value="Hidden"/> 
         <Setter TargetName="theBorder" Property="Background" Value="Transparent"/> 
        </Trigger> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter TargetName="theContent" Property="Visibility" Value="Visible"/> 
        </Trigger> 
        <Trigger Property="IsPressed" Value="True"> 
         <Setter TargetName="theContent" Property="Visibility" Value="Visible"/> 
         <Setter TargetName="theBorder" Property="Background" Value="Orange"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

Está eliminando el envoltorio de DataTemplate de TextBlock resolver el problema? – LPL

+0

@LPL. No, sin el wrapper de DataTemplate es un error en tiempo de ejecución: Error 'System.Windows.Controls.TextBlock' no es un valor válido para la propiedad 'System.Windows.Controls.ContentControl.ContentTemplate' en un Setter. – Berryl

+0

Eliminar el DataTemplate funciona para mí. Debería simplemente poner su contenido en la propiedad del contenido. No se requiere plantilla – Phil

Respuesta

14

Su propiedad Content se establece en un DataTemplate

DataTemplates están destinados a ser utilizados con Template propiedades, y no se inserta directamente en el VisualTree a través de la propiedad Content

Cambia tu Setter de Estilo para establecer el ContentTemplate en lugar de Content y que debería funcionar bien

<Setter Property="ContentTemplate"> 
    <Setter.Value> 
     <DataTemplate> 
      <TextBlock Text="a" FontFamily="Wingdings 3" FontWeight="Bold" FontSize="18" Foreground="Navy" /> 
     </DataTemplate> 
    </Setter.Value> 
</Setter> 

En cuanto a su segunda pregunta, me quedo con la primera, ya que su más simple, y creo que puede contener menos elementos en el árbol visual (que tendría que hacer doble compruebe que)

+6

Bingo, como era de esperar. Confirma mi sospecha de que la curva de aprendizaje de WPF es sorprendentemente abrupta cuando solo hay un puñado de personas que constantemente tienen las respuestas a lo que deberían ser preguntas mundanas. Aclamaciones – Berryl

Cuestiones relacionadas