IValueConverterでBurshからColorにする

テンプレートでこんなのがあったとする。

<Rectangle Fill={TemplateBinding Background}/>

この Fill をテンプレートの中でグラデーションにしたい。
Background は厳密には SolidColorBrush かもしれないし ImageBrush かもしれないけど、常に SolidColorBrush だと仮定して、意味的には↓こんな感じにしたい。

<Rectangle>
  <Rectangle.Fill>
    <LinearGradientBrush StartPoint=".5,0" EndPoint=".5,1">
      <GradientStopCollection>
        <GradientStop Offset="0" Color="{TemplateBinding Background}"/>  <!-- ←まちがってる -->
        <GradientStop Offset="1" Color="#FFFFFFFF"/>
      </GradientStopCollection>
    </LinearGradientBrush>
  </Rectangle.Fill>
</Rectangle>

このままだと Background は Brush だから Color に変換できなくてエラーになる。


変換はおいといて、まずは Color型の BackgroundColor プロパティを追加して、そっちを使ってみるテスト...。

<GradientStop Offset="0" Color="{TemplateBinding BackgroundColor}"/>

うまくいくと思ったけどダメ。この場合...

<GradientStop Offset="0" 
  Color="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BackgroundColor}"/>

と書くみたい...。バインディングが未だにわかってないなw


やっぱり Background を使いたいので Brush から Color に変換するコンバーターを作ってみる...

class BrushToColorConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter,
    System.Globalization.CultureInfo culture)
  {
    SolidColorBrush brush = value as SolidColorBrush;
    if (brush != null) {
        return brush.Color;
    }
    return Colors.Transparent;
  }
  public object ConvertBack(object value, Type targetType,
    object parameter, System.Globalization.CultureInfo culture)
  {
    throw new NotImplementedException();
  }    
}

で、XAMLインスタンス作って、使う。

<Grid.Resources>
  <gaeeyo:BrushToColorConverter x:Key="BrushToColorConverter"/>
</Grid.Resources>
<GradientStop Offset="0" 
  Color="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background, Converter={StaticResource BrushToColorConverter}}"/>

これでいける? 実行してみると...

'MS.Internal.NativeParseException' の初回例外が System.Windows.dll で発生しました。

追加情報: 一致するコンストラクターが型 'Gaeeyo.BrushToColorConverter' にありません。

ぐは。
ここでハマってしまったけど、BrushToColorConverter クラスが public になってなかっただけだった...orz

追記 2010-07-13

あぁ、Pathで書けるんだ...。

{Binding Path=Background.Color}