2012-06-16 13 views
6

L'xaml per il primo stile funziona come voglio, producendo un pulsante con un glifo di Wingding che usa setter per disporre il contenuto e le sue proprietà. La seconda versione di questo stile sta cercando di fare la stessa cosa ma con un DataTemplate per il Contenuto, ma mostra solo il tipo di un DataTemplate (cioè System.Windows.DataTemplate).Contenuto di stile tramite setter v ContentTemplate

  1. Perché la seconda versione non visualizza lo stesso contenuto della prima?
  2. Supponendo che la correzione sia banale, sarebbe preferibile una versione dello stile rispetto all'altra per qualsiasi motivo al di là delle preferenze personali?

NOTA: sto mostrando le associazioni e attiva nel caso in cui ci sia qualcosa in là che sta influenzando il contenuto, ma è solo la prima parte dello stile che varia

Cheers,
Berryl

Style 1

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

Style 2

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

La rimozione del DataTemplate di avvolgimento da TextBlock risolve il problema? – LPL

+0

@ LPL. No, senza che il DataTemplate includa un errore di runtime: Errore 'System.Windows.Controls.TextBlock' non è un valore valido per la proprietà 'System.Windows.Controls.ContentControl.ContentTemplate' su un Setter. – Berryl

+0

La rimozione del DataTemplate funziona per me. Dovresti semplicemente inserire il tuo contenuto nella proprietà del contenuto. Nessun modello richiesto. – Phil

risposta

14

La tua struttura Content è impostata su un DataTemplate

DataTemplates sono destinate ad essere utilizzato con Template proprietà, e non inserito direttamente in il VisualTree tramite la proprietà Content

Modifica il settatore di stile per impostare ContentTemplate invece di Content e dovrebbe funzionare bene

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

Per quanto riguarda la seconda domanda, io preferisco il primo perché la sua più semplice, e penso che può contenere un numero inferiore di elementi in Visual albero (avrei dovuto double- controllare che)

+6

Bingo, non sorprende. Conferma il mio sospetto che la curva di apprendimento del WPF sia incredibilmente ripida quando c'è solo una manciata di persone che hanno costantemente le risposte a quelle che dovrebbero essere domande banali. Saluti – Berryl

Problemi correlati