2012-06-16 10 views
6

Das XAML für den ersten Stil funktioniert wie ich will, und erzeugt eine Schaltfläche mit einem Wingding-Symbol, das Setter verwendet, um den Inhalt und seine Eigenschaften festzulegen. Die zweite Version dieses Stils versucht dasselbe zu tun, aber mit einem DataTemplate für den Inhalt, aber es zeigt nur den Typ eines DataTemplate (dh System.Windows.DataTemplate) an.Style-Inhalt über Setter v ContentTemplate

  1. Warum wird die zweite Version nicht den gleichen Inhalt wie die erste anzeigen?
  2. Angenommen, die Korrektur ist trivial, würde eine Version des Stils gegenüber der anderen aus irgendeinem Grund vorzuziehen sein, der über persönliche Vorlieben hinausgeht?

Hinweis: Ich bin die Bindungen zeigt und löst den Fall, dass es etwas gibt, dass der Inhalt zu beeinflussen, aber es ist nur das der erste Teil des Stils,

Cheers,
Berryl variiert

Stil 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

Entfernen der Wrapping DataTemplate von TextBlock das Problem zu lösen? – LPL

+0

@LPL. Nein, ohne dass das DataTemplate-Objekt einen Laufzeitfehler enthält: Fehler 'System.Windows.Controls.TextBlock' ist kein gültiger Wert für die Eigenschaft 'System.Windows.Controls.ContentControl.ContentTemplate' in einem Setter. – Berryl

+0

Das Entfernen der DataTemplate funktioniert für mich. Sie sollten Ihren Inhalt einfach in die Inhaltseigenschaft einfügen. Keine Vorlage erforderlich – Phil

Antwort

14

Ihre Content Eigenschaft auf einen DataTemplate gesetzt

DataTemplates sollen mit Template Eigenschaften verwendet werden, und nicht direkt eingefügt in der VisualTree über die Content Eigenschaft

Ändern Sie Ihren Style Setter, um dieeinzustellenstatt Content und es sollte Was Ihre zweite Frage, ziehe ich die erste, weil seine einfacher, und ich denke, es kann weniger Elemente in der Baumstruktur enthalten (ich würde feine

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

arbeiten müssen Double- Überprüfen Sie, dass)

+6

Bingo, nicht überraschend. Es bestätigt meinen Verdacht, dass die WPF-Lernkurve überraschend steil ist, wenn es nur eine Handvoll Leute gibt, die immer die Antworten auf die Fragen haben, die banal sein sollten. Prost – Berryl