テンプレートでこんなのがあったとする。
<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(); } }
<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}