2011-02-07 8 views
2

私はわずかに退色したテキストを通常表示するカスタムボタンを作成しており、フル強度のテキストはMouseOverまたはMouseDownに作成しています。私は、これらのテキスト色のブラシを表現するために私のコントロールのGeneric.xamlに2つのリソースを定義している:リソースをカスタムコントロールプロパティにバインドする

<!-- Text Brushes --> 
<SolidColorBrush x:Key="NormalTextBrush" Color="Black" /> 
<SolidColorBrush x:Key="FadedTextBrush" Color="Gray" /> 

コントロールがコンパイルされ、その構成で正常に動作します。

しかし、カスタムコントロールのForegroundプロパティを使用して、コントロールのユーザーにテキストの色を設定させたいとします。だから、私はこれにリソース宣言を変更:

<!-- Text Brushes --> 
<SolidColorBrush x:Key="NormalTextBrush" Color="{Binding Path=Foreground, RelativeSource={RelativeSource TemplatedParent}}" /> 
<SolidColorBrush x:Key="FadedTextBrush" Color="{Binding Path=Foreground, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource ColorConverter}, ConverterParameter='1.2'}" /> 

2番目の宣言は、テキストの色をフェードするHSL値コンバータを使用しています。

は今、コントロールが動作しない、と私は、出力ウィンドウに次のエラーが表示されます。

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Foreground; DataItem='TaskButton' (Name='Button1'); target element is 'SolidColorBrush' (HashCode=38118303); target property is 'Color' (type 'Color') 
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Foreground; DataItem=null; target element is 'SolidColorBrush' (HashCode=47449297); target property is 'Color' (type 'Color') 

私はData Errorが私に言っているかわからないんだけど。誰が何が起こっているのか、どのように修正するのか教えていただけますか?ご協力いただきありがとうございます。

答えて

4

RelativeSource TemplatedParent(IIRC)はコントロールテンプレート内で意味を持ち、テンプレートが適用されたコントロールのインスタンス上のプロパティを参照します。

UserControlの内容はUserControlのテンプレートではありません。したがって、このバインディングでは親のUserControlは実行可能なターゲットとはみなされません。

エラーメッセージは、SolidColorBrushにテンプレートがないことを示しています。 System.Windows.Controls.Controlを拡張しません。テンプレート型のUIコントロールの基本型です(ほとんどの場合)。テンプレートの詳細については、Control.Templateを参照してください。

あなたがしたいことは、相対ソースFindAncestorを設定します。

{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}} 

これは、視覚を歩いていく(あるいはそれが論理的である?)ツリーはタイプUserControlの最初の祖先を見つけるために、その後、Foregroundと呼ばれるパブリックプロパティに対してバインドします。

SolidColorBrushResourceと定義されている場合、これは機能しません。リソースはビジュアル(または論理ツリー、またはその両方)の一部ではないため、依然として明確ではないため、RelativeSourceバインディングはツリーの祖先を歩くことができません。

UserControlと同じフォアグラウンドカラーを使用するコントロールにバインディングを直接使用する必要があります。

+0

説明のために+1 –

+0

これに受け入れられた答えを変更しました - FindAncestorについてのヒントは、ソリューションの重要な要素でした。 –

+0

Hmmm、私は相対的なソースバインディングがビジュアルツリーを歩き、リソースは論理ツリーのメンバーだと思う。私はいつもこれを嫌っている。誰かが100%知っていることが起こった場合、これを読んで、コメントを残してください、THX。 – Will

2

リソースに定義されている要素にRelativeSourceバインディングを使用できないという問題は、ビジュアルツリーまたは論理ツリーの一部ではないためです。

これを修正するには、リソースへの参照を設定する場所(ボタンのコントロールテンプレート内)でこれらのバインディングを設定するだけです。このような何か:

<ControlTemplate TargetType="{x:Type Button}"> 
    <Border x:Name="brd" 
      TextBlock.Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource TemplatedParent}}"> 
     ... 
    </Border> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsMouseOver" 
       Value="True"> 
      <Setter TargetName="brd" 
        Property="TextBlock.Foreground" 
        Value="{Binding Path=Foreground, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource ColorConverter}, ConverterParameter='1.2'}"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

言い換えれば、あなたはresoursesを定義する必要はありません - NormalTextBrushFadedTextBrushを。

+0

最初に答えとして受け入れられ、+1 –

関連する問題