2012-06-16 37 views
6

Xaml dla pierwszego stylu działa tak, jak chcę, tworząc przycisk z glifem Wingdinga za pomocą seterów, aby rozmieścić zawartość i jej właściwości. Druga wersja tego stylu próbuje zrobić to samo, ale z DataTemplate dla treści, ale po prostu wyświetla typ DataTemplate (tj. System.Windows.DataTemplate).Treści stylów za pomocą ustawiaczy v ContentTemplate

  1. Dlaczego druga wersja nie wyświetla tej samej zawartości co pierwsza?
  2. Zakładając, że poprawka jest banalna, czy jedna wersja stylu byłaby lepsza od drugiej z jakiegokolwiek innego powodu, poza osobistymi preferencjami?

UWAGA: Jestem pokazując powiązania i wyzwala w przypadku istnieje coś tam, że ma wpływ na treść, ale to dopiero pierwsza część stylu, który zmienia

Wiwaty,
Berryl

Style 1

Wyświetla: 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

Wyświetla "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

Czy usunięcie opakowania DataTemplate z TextBlock rozwiązało problem? – LPL

+0

@LPL. Nie, bez zawijania DataTemplate jego błąd runtime: Błąd "System.Windows.Controls.TextBlock" nie jest prawidłową wartością właściwości "System.Windows.Controls.ContentControl.ContentTemplate" na setera. – Berryl

+0

Usuwanie DataTemplate działa dla mnie. Powinieneś po prostu umieścić swoją zawartość we właściwości content. Bez szablonu. – Phil

Odpowiedz

14

Twoja nieruchomość Content jest ustawiony na DataTemplate

DataTemplates są przeznaczone do pracy z Template właściwości, a nie bezpośrednio włożona VisualTree poprzez Właściwość

Zmień ustawienie stylu, aby ustawić ContentTemplate zamiast Content i powinien działać dobrze

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

Co do drugiego pytania, wolę pierwszy, ponieważ jej prostszą i myślę, że może ona zawierać mniej elementów w Visual Tree (bym musiał podwójnie sprawdź to)

+6

Bingo, nic dziwnego. Potwierdza to moje podejrzenie, że krzywa uczenia się WPF jest zaskakująco stroma, kiedy tylko garstka ludzi, którzy stale mają odpowiedzi na to, co powinno być zwykłymi pytaniami. Twoje zdrowie – Berryl

Powiązane problemy