为什么我必须在WPF中使用“资源”?

时间:2010-03-05 16:24:53

标签: wpf

我只是潜入WPF并发现这有点奇怪而且让我的风格感到沮丧:为什么某些东西的价值可能是资源,但你不能直接将值设置为资源代表的东西?例如:

这是有效的:

<ToggleButton>
    <ToggleButton.Resources>
        <Image x:Key="cancelImage" Source="cancel.png" />
    </ToggleButton.Resources>
    <ToggleButton.Style>
        <Style TargetType="{x:Type ToggleButton}">
            <Setter Property="Content" Value="{DynamicResource cancelImage}" />
        </Style>
    </ToggleButton.Style>
</ToggleButton>

但这不是:

<ToggleButton>
    <ToggleButton.Style>
        <Style TargetType="{x:Type ToggleButton}">
            <Setter Property="Content">
                <Setter.Value>
                    <Image Source="cancel.png" />
                </Setter.Value>
            </Setter>
        </Style>
    </ToggleButton.Style>
</ToggleButton>

有什么区别?为什么两者都不起作用?我不喜欢为某些事情创建一个“资源”,因为它会将我的代码分开并使其更难以阅读。

是的,我知道我的例子可以像这样简化

<ToggleButton>
    <Image Source="cancel.png" />
</ToggleButton>

但这不是重点。

1 个答案:

答案 0 :(得分:3)

使用setter时,setter的值必须支持“冻结”的能力。这可以是值类型(包括结构和枚举),也可以是从Freezable派生的类。

它可能对你的审美意识不大,但是在文件(或ResourceDictionary)的Resources部分顶部声明所有资源通常更简洁,而不是将它们添加到单个样式的资源或控制。