2012-06-16 17 views
6

İlk stil için xaml istediğim şekilde çalışır, içeriği ve özelliklerini belirlemek için ayarlayıcıları kullanarak bir Wingding glifine sahip bir düğme üretir. Bu stilin ikinci sürümü aynı şeyi yapmaya çalışıyor ancak İçerik için bir DataTemplate ile, ancak sadece bir DataTemplate (System.Windows.DataTemplate) türünü görüntüler.Yaratıcı içeriğe göre içerik ContentTemplate

  1. Neden ikinci sürüm 1. ile aynı içeriği göstermiyor?
  2. Düzeltmenin önemsiz olduğunu varsayarsak, stilin bir sürümü kişisel tercihin ötesinde herhangi bir nedenle diğerine tercih edilebilir mi?

NOT: Ben bağlamaları gösteren ve durumda tetikler am orada bu içeriği etkiliyor şey var, ama

Şerefe değişir tarzı,
Berryl

sadece ilk parçası

Stil 1

görüntüler: 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> 

Stil 2

görüntüler "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

Sarma DataTemplate'i TextBlock'dan kaldırmak sorunu çözüyor mu? – LPL

+0

@LPL. Hayır, DataTemplate bir çalışma zamanı hatası olmadan: Hata 'System.Windows.Controls.TextBlock' bir Setter 'System.Windows.Controls.ContentControl.ContentTemplate' özelliği için geçerli bir değer değil. – Berryl

+0

DataTemplate'i kaldırmak benim için çalışıyor. İçeriğinizi içerik özelliğine koymalısınız. Şablon gerektirmez. – Phil

cevap

14

Sizin Content tesiste DataTemplate

DataTemplates olarak ayarlanır Template özellikleri ile kullanılacak şekilde tasarlanmıştır ve doğrudan takılan edilmez VisualTree ile Content özelliği

'i ayarlamak için Stil Ayarlayıcınızı değiştirin yerine Content aitve ikinci soruya gelince ince

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

çalışması gerekir, ben ilk tercih çünkü onun basit ve bunu Görsel Ağacında az öğeler içerebilir düşünüyorum (ben çift- olurdu Bunu kontrol edin

+6

Bingo, şaşırtıcı bir şekilde. Bu, WPF öğrenme eğrisinin, sıradan sorular olması gereken sorulara sürekli olarak cevap veren küçük bir avuç insanın olduğu zaman, şaşırtıcı bir şekilde dik olduğu şüphesini doğrulamaktadır. Şerefe – Berryl

İlgili konular