A和B之间的区别是什么都有效。 我是否可以使用绑定到StaticResource来替换 inplace DynamicResource?
<Button Content="{DynamicResource content}">
<Button.Resources>
<sys:String x:Key="content">A</sys:String>
</Button.Resources>
</Button>
<Button Content="{Binding Source={StaticResource content}}">
<Button.Resources>
<sys:String x:Key="content">B</sys:String>
</Button.Resources>
</Button>
因为这不起作用(因为它是在使用后定义的):
<Button Content="{StaticResource content}">
<Button.Resources>
<sys:String x:Key="content">C</sys:String>
</Button.Resources>
</Button>
答案 0 :(得分:2)
StaticResource
和DynamicResource
之间的主要区别在于,当解析并应用Xaml(或Baml)时,StaticResource
仅提供一次值。尽管另一个答案是说,StaticResource
在编译时解析 。
DynamicResource
提供表达式值,其中表达式是一个“实时”资源引用,可以响应将来的更改。
对于要应用的StaticResource
,当要求标记扩展名提供值时,请求的资源必须在范围内。如果它不在范围内,资源查找将失败。对于DynamicResource
,情况并非如此:如果请求的资源不在范围内,则不会应用任何值。如果资源稍后进入范围,它将被提取。同样,如果引用的资源被删除或替换,则目标属性也会相应更新。
由于DynamicResource
为值提供了表达式,因此它只能应用于依赖项属性。 StaticResource
可以应用于任何能够接收标记扩展名的属性。
考虑到这一点,让我们重温你的问题:
我是否可以将
DynamicResource
替换为[{1}}Binding
到StaticResource
?
当且仅当:
时,您可以将DynamicResource
替换为StaticResource
如果已知上述条件为真,那么最好使用StaticResource
,因为静态资源比动态资源更轻量级。使用动态资源必然需要一些额外的开销,因为需要连接更改侦听器。
但是,将{DynamicResource content}
替换为{Binding Source={StaticResource content}}
毫无意义。如果您只想插入资源引用,那么将Binding
包裹起来是没有意义的。只需使用{StaticResource content}
。
次,您可能希望将StaticResource
用于绑定的Source
,但只有在深入了解值内部资源,或者如果您需要应用转换器。
因为这不起作用(因为它是在使用后定义的):
<Button Content="{StaticResource content}"> <Button.Resources> <sys:String x:Key="content">C</sys:String> </Button.Resources> </Button>
右。要直接使用StaticResource
,您需要将资源移至外部作用域,或在<{em> Content
之后设置Resources
(使用<Button.Content>
元素语法)。
现在,关于这个人:
<Button Content="{Binding Source={StaticResource content}}"> <Button.Resources> <sys:String x:Key="content">B</sys:String> </Button.Resources> </Button>
你确定这是否有效?对我来说,它适用于设计器,但如果我实际上运行应用程序,它就会像直接使用StaticResource
时那样失败。
答案 1 :(得分:1)
DynamicResource
在运行时解析
虽然StaticResource
在编译期间被解析并放在BAML
中
如果它们有效,那么您的ResourceDictionaries就会被正确解析
他们都是正确的,但他们以两种不同的方式“工作”
我是否可以将DynamicResource替换为绑定到StaticResource?
您可以。主要是在加载Window或UserControl的时间需要很长时间时会使用DynamicResource
的修改
编辑后,我可以告诉您,尝试使用它后,您尝试使用的资源已定义。如果将该资源移动到可视树的顶部,即Window或UserControl,那么它将可供您使用。这是因为编译器正在尝试解析此时尚不存在的名称content
。如果你要使用一个在运行时而不是编译时解析的DynamicResource,那么你会看到差异
编辑2
正如EdPlunket指出StaticResource
如果更改将不会反映在屏幕上,但是如果您更改DynamicResource
,则会更新。{
编辑3
我应该更清楚地说明DynamicResource
StaticResource
是解决应用程序中使用的资源的标记扩展。另外值得一提的是,x:Static
和x:Type
也是Markup Extensions。