TemplateBinding
この特定のケースで失敗するように見えるのはなぜですか?
基本的な拡張ボタンを使用します。
public class IconButton : Button
{
public ImageSource Icon
{
get { return (ImageSource)GetValue(IconProperty); }
set { SetValue(IconProperty, value); }
}
public static readonly DependencyProperty ImageProperty =
DependencyProperty.Register("Icon", typeof(ImageSource), typeof(IconButton), new PropertyMetadata(null));
public IconButton()
{
DefaultStyleKey = typeof(IconButton);
}
}
コントロール テンプレートは、次を使用してアイコンを表示しますOpacityMask
。
<Style TargetType="controls:IconButton">
<Setter Property="Width" Value="30" />
<Setter Property="Height" Value="30" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="controls:IconButton">
<Grid>
<Rectangle Fill="{StaticResource PhoneForegroundBrush}"
Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
<Rectangle.OpacityMask>
<ImageBrush ImageSource="{TemplateBinding Icon}" />
</Rectangle.OpacityMask>
</Rectangle>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
これは黙って失敗します。コントロールは塗りつぶされた四角形として表示されます。の代わりに通常の画像を使用するとImageBrush
、バインディングは成功します。
<ControlTemplate TargetType="controls:IconButton">
<Grid>
<Image Source="{TemplateBinding Icon}" />
</Grid>
</ControlTemplate>
画像のソース パスをハードコードした場合も正しく動作します。
<ControlTemplate TargetType="controls:IconButton">
<Grid>
<Rectangle Fill="{StaticResource PhoneForegroundBrush}"
Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
<Rectangle.OpacityMask>
<ImageBrush ImageSource="/Images/appbar.next.rest.png" />
</Rectangle.OpacityMask>
</Rectangle>
</Grid>
</ControlTemplate>
では、なぜTemplateBinding
の中で失敗するのImageBrush
でしょうか?
アップデート
演繹的に (そして Chris からの回答のおかげで)、考えられる要因は次のとおりです。
ImageBrush
からではなく、から継承するDependencyObject
FrameworkElement
TemplateBinding
通常のバインディングのような暗黙的な型変換をサポートしていません (つまり、文字列から ImageSource へ)。
点がどのようにつながっているかはまだわかりませんが...