我只是潜入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>
但这不是重点。
答案 0 :(得分:3)
使用setter时,setter的值必须支持“冻结”的能力。这可以是值类型(包括结构和枚举),也可以是从Freezable派生的类。
它可能对你的审美意识不大,但是在文件(或ResourceDictionary)的Resources部分顶部声明所有资源通常更简洁,而不是将它们添加到单个样式的资源或控制。