WPF 中 StaticResources 和 DynamicResources 的区别是什么?

3
在WPF中,StaticResources和DynamicResources有何区别?
编辑: 以下是XAML文件中的代码:
<ComboBox Canvas.Left="14" Style="{StaticResource ComboBoxStyle}"
          Canvas.Top="137" Height="33" Name="cmbItem" Width="170"
          SelectionChanged="cmbItem_SelectionChanged">
    <ComboBoxItem>Name</ComboBoxItem>
    <ComboBoxItem>Age</ComboBoxItem>
</ComboBox>

以下代码位于资源字典文件中。
<Style x:Key="ComboBoxStyle" TargetType="{x:Type ComboBox}">

    <Setter Property="FocusVisualStyle" Value="{StaticResource ComboBoxFocusVisual}"/>

    <Setter Property="Foreground" Value="#FF436B13"/>
</Style>
2个回答

6

动态资源在使用时进行评估。静态资源在加载时进行评估。

来自MSDN

当您使用标记扩展时,通常会以字符串形式提供一个或多个参数,这些参数由特定的标记扩展处理,而不是在设置属性的上下文中进行评估。StaticResource标记扩展通过查找所有可用资源字典中的键来处理键。这发生在加载期间,即加载过程需要分配采用静态资源引用的属性值的时间点。DynamicResource标记扩展通过创建表达式来处理键,并且该表达式保持未评估状态,直到实际运行应用程序时评估该表达式并提供值。

有关何时选择哪个选项的更多详细信息,请参见该页面。


我遇到了这个错误:"无法找到名为'{ComboBoxFocusVisual}'的资源。资源名称区分大小写。在标记文件中,对象'cmbItem'出现错误"。请建议一个解决方案。 - Jaswant Agarwal
这段代码在XAML文件中:<ComboBox Canvas.Left="14" Style="{StaticResource ComboBoxStyle}" Canvas.Top="137" Height="33" Name="cmbItem" Width="170" SelectionChanged="cmbItem_SelectionChanged"> <ComboBoxItem>Name</ComboBoxItem> <ComboBoxItem>Age</ComboBoxItem> </ComboBox> 下面的代码在资源字典文件中:<Style x:Key="ComboBoxStyle" TargetType="{x:Type ComboBox}"/> - Jaswant Agarwal
我已将代码添加到原始帖子中,以便更容易阅读... 但是我在那段代码中没有看到“ComboBoxFocusVisual”。 - Thomas Levesque
<ResourceDictionary>代码如下,原始帖子在哪里?<Style x:Key="ComboBoxStyle" TargetType="{x:Type ComboBox}"> <Setter Property="FocusVisualStyle" Value="{StaticResource ComboBoxFocusVisual}"> </Style> - Jaswant Agarwal

2

根据您在Jon的回答下面的评论:

我遇到了这个错误“Cannot find resource named '{ComboBoxFocusVisual}'. Resource names are case sensitive. Error at object 'cmbItem' in markup file”

我认为您的ComboBoxFocusVisual资源是在ComboBoxStyle之后声明的,因此StaticResource扩展无法找到它。您应该在引用它之前声明它,或使用DynamicResource扩展引用它。


我已经看到了编辑后的帖子,我的回答仍然是一样的...我告诉过你要改变什么。有什么你不明白的吗? - Thomas Levesque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接