首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当目标是一个TemplateBinding时,ImageBrush.ImageSource失败

当目标是一个TemplateBinding时,ImageBrush.ImageSource失败
EN

Stack Overflow用户
提问于 2014-03-02 22:11:43
回答 2查看 1.1K关注 0票数 4

为什么TemplateBinding在这种特殊情况下似乎失败了?

取一个基本扩展按钮:

代码语言:javascript
运行
复制
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显示图标。

代码语言:javascript
运行
复制
<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,那么绑定是成功的:

代码语言:javascript
运行
复制
            <ControlTemplate TargetType="controls:IconButton">
                <Grid>
                    <Image Source="{TemplateBinding Icon}" />
                </Grid>
            </ControlTemplate>

如果我硬编码图像源路径,它也能正常工作:

代码语言:javascript
运行
复制
            <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>

那么,为什么TemplateBindingImageBrush内部失败呢?

更新

通过推论(感谢Chris的回答),可能的因素有:

但我还是不明白这些点是怎么联系起来的.

EN

Stack Overflow用户

发布于 2014-03-02 22:23:30

这里有个解决办法。奇怪的是,使用RelativeSource TemplatedParent绑定而不是TemplateBinding解决了这个问题。

代码语言:javascript
运行
复制
<ImageBrush ImageSource="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Icon}" />

理论上这是完全相同的约束..。谁知道呢?什么都行。

票数 4
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22134281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档