我是否可以使用绑定到Source = StaticResource

时间:2018-01-10 14:50:16

标签: c# wpf xaml

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>

2 个答案:

答案 0 :(得分:2)

StaticResourceDynamicResource之间的主要区别在于,当解析并应用Xaml(或Baml)时,StaticResource仅提供一次值。尽管另一个答案是说,StaticResource在编译时解析

DynamicResource提供表达式值,其中表达式是一个“实时”资源引用,可以响应将来的更改。

对于要应用的StaticResource,当要求标记扩展名提供值时,请求的资源必须在范围内。如果它不在范围内,资源查找将失败。对于DynamicResource,情况并非如此:如果请求的资源不在范围内,则不会应用任何值。如果资源稍后进入范围,它将被提取。同样,如果引用的资源被删除或替换,则目标属性也会相应更新。

由于DynamicResource为值提供了表达式,因此它只能应用于依赖项属性StaticResource可以应用于任何能够接收标记扩展名的属性。

考虑到这一点,让我们重温你的问题:

  

我是否可以将DynamicResource替换为[{1}} BindingStaticResource

当且仅当:

时,您可以将DynamicResource替换为StaticResource
  1. 加载Xaml时,资源将在范围内。
  2. 资源不会在运行时被替换。
  3. 如果已知上述条件为真,那么最好使用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:Staticx:Type也是Markup Extensions。