繁体   English   中英

我是否可以始终将DynamicResource替换为与Source = StaticResource的绑定

[英]Can I always replace DynamicResource with a Binding to a Source=StaticResource

A和B的区别是什么? 是否可以始终用与StaticResource的绑定替换就地 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>

StaticResourceDynamicResource之间的主要区别在于,在解析和应用Xaml(或Baml)时, StaticResource仅提供一次值。 尽管有其他答案, 在编译时不会解决StaticResource

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

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

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

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

我是否可以始终使用与StaticResourceBinding替换[an]就地DynamicResource

仅在以下情况下,才能StaticResource替换DynamicResource

  1. 加载Xaml时,资源将在作用域内。
  2. 运行时不会替换资源。

如果已知上述条件成立,则最好使用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 ,您需要将资源移到外部作用域或在Resources 之后设置Content (使用<Button.Content>元素语法)。

现在,关于这个家伙:

 <Button Content="{Binding Source={StaticResource content}}"> <Button.Resources> <sys:String x:Key="content">B</sys:String> </Button.Resources> </Button> 

确定这可行吗? 对我来说,它可以在设计器中工作,但是如果我实际运行该应用程序,则它会像直接使用StaticResource时一样失败。

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`。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM