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

时间:2009-09-14 09:12:10

标签: c# wpf resources wpf-controls

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 个答案:

答案 0 :(得分:6)

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

来自MSDN

  

当您使用标记扩展时,您   通常提供一个或多个   字符串形式的参数   由特定标记处理   扩展,而不是被评估   在财产的背景下   组。 StaticResource标记   扩展通过查看处理密钥   在所有中增加该键的值   可用的资源词典。这个   在加载期间发生,这是   加载过程中的时间点   需要分配属性值   采用静态资源   参考。 DynamicResource标记   而是通过扩展来处理密钥   创造一个表达,然后   表达仍然没有评估,直到   该应用程序实际上是在运行   哪个时候评估表达式   并提供一个价值。

关于何时应该选择哪个选项,还有更多细节。

答案 1 :(得分:2)

以下评论中Jon的回答:

  

我收到此错误“无法找到名为'{ComboBoxFocusVisual}'的资源。资源名称区分大小写。标记文件中对象'cmbItem'出错”

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

引用它