2012-06-16 6 views
6

最初のスタイルのxamlは、セッターを使用してコンテンツとそのプロパティをレイアウトするWingdingグリフ付きのボタンを生成します。このスタイルの2番目のバージョンは同じことをしようとしていますが、Content用のDataTemplateを使用していますが、DataTemplate(つまり、System.Windows.DataTemplate)のタイプを表示するだけです。セッターによるスタイルコンテンツv ContentTemplate

  1. 第2版で第1版と同じ内容が表示されないのはなぜですか。
  2. 修正が簡単であるとすれば、個人的な好み以外の理由で、一方のバージョンのスタイルが他方のスタイルよりも好ましいでしょうか?

注:私はバインディングを示すと何かがそれはそこにあった場合にトリガしていますが、コンテンツに影響を及ぼしているが、それは

乾杯、
Berryl

を変化させるスタイルの最初の部分だけです

スタイル1

ディスプレイ: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> 

スタイル2

ディスプレイ "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

TextBlockからDataTemplateを取り除いて問題を解決していますか? @LPL。 – LPL

+0

いいえ、DataTemplateが実行時エラーをラップすることはありません。エラー 'System.Windows.Controls.TextBlock'は、Setterの 'System.Windows.Controls.ContentControl.ContentTemplate'プロパティの有効な値ではありません。 – Berryl

+0

DataTemplateを削除すると、私のために動作します。コンテンツをコンテンツプロパティに入れるだけです。テンプレートは不要です。 – Phil

答えて

14

あなたContentプロパティがDataTemplate

DataTemplatesに設定されているがTemplateプロパティと一緒に使用するためのもの、と直接に挿入されていませんVisualTree経由でContentプロパティ

を設定するスタイルセッターを変更します。代わりにContentのと、それはあなたの2番目の質問については罰金

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

を動作するはずですが、私が最初に好む理由はそのシンプルな、と私はそれがビジュアルツリー内のより少ない要素を含んでよいと思います(私はダブルする必要があると思いますそれを確認してください)

+6

ビンゴ、意外にも。それは、世俗的な質問であるべきものに対する答えを一貫して持っている人がほんの一握りしかいないとき、WPFの学習曲線が驚くほど急であるという私の疑惑を確認します。乾杯 – Berryl

関連する問題