2016-09-09 10 views
0

カスタムコントロールでは、テンプレート内のTextBlockにStyle(DependencyPropertyとして指定)を使用したいと思います。カスタムコントロールのStyle型のDependencyProperty

MyControl.cs

public static DependencyProperty HeadingStyleProperty = 
    DependencyProperty.Register("HeadingStyle", 
           typeof (Style), 
           typeof (MyControlElement), 
           new PropertyMetadata(new Style(typeof(TextBlock)))); 

public Style HeadingStyle { 
    get { return (Style) GetValue(HeadingStyleProperty); } 
    set { SetValue(HeadingStyleProperty, value); } 
} 

MyControl.xaml

<ResourceDictionary ...> 
    <Style TargetType="local:MyControl"> 
     <Style.Resources> 
      <!-- Getting error on BasedOn="TemplateBinding --> 
      <Style TargetType="TextBlock" BasedOn="{TemplateBinding HeadingStyle}" x:Key="Heading" /> 
     </Style.Resources> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate> 
        <TextBlock Style="{StaticResource Heading}" Text="StyledHeading" /> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

私はそれが予選タイプ名を持っていないため、コンパイラエラー 'HeadingStyle' メンバが有効ではありません取得します。

私のDPのデータタイプをスタイルからより特定のものに変更する必要がありますか?または、このエラーの原因DPの初期値は、あなたが任意のがそれに結合設定することはできませんのでStyleは、DependencyObjectから派生していない、すべての

+0

これはWPFのため、TargetTypeを "TargetType =" {x:Type TextBlock} "を含むように変更する必要があります。" –

+0

これは私の問題を解決しません。私はそれが私のDPで(おそらく私はそれがスタイルであれば別の方法でDPを定義しなければならない...)引き起こされると思います。 – WPFGermany

答えて

2

まず... TargetTypeにTextBlockのためのスタイルに設定されています。

あなたのTextBlockが(テンプレートの一部である)あなたの財産でスタイリングしたい場合は、単純に(あなたがとにかくリソースとして定義されたスタイルの目的が何であるか?)直接そのStyle性質上TemplateBindingを設定。これは2つの方法で行うことができます。一つは、完全修飾されたプロパティ名を使用することです:

<ControlTemplate> 
    <TextBlock Style="{TemplateBinding local:MyControl.HeadingStyle}" (...) /> 
</ControlTemplate> 

に他の方法を、より一般的に使用される、単純化されたプロパティ名を使用することですが、それが指定するControlTemplate.TargetTypeが必要です。

<ControlTemplate TargetType="{x:Type local:MyControl}"> 
    <TextBlock Style="{TemplateBinding HeadingStyle}" (...) /> 
</ControlTemplate> 

第二の方法XAMLパーサーがHeadingStyleプロパティを解決する方法を知る上で十分スマートであるため - ControlTemplate.TargetTypeを指定しなかった場合は、現在取得しているのとまったく同じエラーが発生します。

<Style x:Key="Heading" BasedOn="{TemplateBinding local:MyControl.HeadingStyle}" (...) /> 

をそれはTemplateBindingExpressionStyleに変換できないことを言って、実行時エラーになり:

もちろん、完全修飾プロパティ名を使用してコードをコンパイルするコンパイラをだましことができます。

+0

ありがとうございます!私のControlTemplateのスタイルをResourceとして使うことができますので、HeadingStyleを直接バインドします。 – WPFGermany

関連する問題