Dynamic Resource – 动态资源

 

Static Resource不同的是,Dynamic Resource可以在程序运行时重新评估/计算资源来生成对应的对象/值,它支持向前引用,只要请求的key在整个应用程序内的任何Resources Dictionary定义过就可以被加载。如果有多个相同的key存在,则最后搜索到的资源为有效。

 

动态资源常用于以下情况:

·         资源直到运行时才能被取定其值的。这些包含想系统资源,或者通过用户交互/用户可以设定的值。例如你可以用Setter Property语法来引用一些系统资源像SystemColors, SystemFonts等,这些是真正的Dynamic Resource,因为他们是来自用户的运行环境。

·         Custom control中有创建/引用主题风格的需求.

·         在运行过程中调整(比如添加或者合并)ReourceDictionary.

·         需要向前引用的场景。

·         创建的Style的值与当前用户设定的主题或其他设定有关的。

·         运行过程中可能更改逻辑树的次序的。

下面的代码片段演示了如何在XAML中引用SystemFonts,这需要用DynamicResource标记:

<Style x:Key="SimpleFont" TargetType="{x:Type Button}">

    <Setter Property = "FontSize" Value= "{DynamicResource {x:Static SystemFonts.IconFontSizeKey}}"/>

    <Setter Property = "FontWeight" Value= "{DynamicResource {x:Static SystemFonts.MessageFontWeightKey}}"/>

    <Setter Property = "FontFamily" Value= "{DynamicResource {x:Static SystemFonts.CaptionFontFamilyKey}}"/>

 

</Style>

Dynamic Resource的查找行为

·         首先遍历请求对象本身定义的Resources集合。

·         然后遍历逻辑树上当前请求对象的父对象,直到遍历到Root(如Page.Reources, Window.Resources, UserControl.Resources等)

·         随后会遍历应用程序的Resources(Application.Resources)

·         进而会Check当前激活的Theme的资源。

·         最后才会去遍历System Resources.

在程序中你可以通过myWindow.Resources[“key”]的方式来直接访问一个资源。另外,WPF还提供了TryFindResource(key)FindResource(key)来支持资源搜索。FindResource方法在没找到资源的情况下会触发ResourceReferenceKeyNotFoundException异常。

 

其实通过上边的示例我们可以很清楚的看到,在使用静态资源的地方我们往往都可以使用动态资源,他们并没有什么合适与否之说,而选择它们中的哪一个,完全取决于你是否需要资源的使用者发现更新。我们可以再来比较一下二者的区别:

 

·         对于资源的更新会反映在那些使用了动态资源的元素上,这是他们最主要的区别。

·         性能上:因为动态资源要跟踪变化,所以需要占用更多的资源。而静态资源往往是在windowpage加载之后来引用,动态资源会改善加载时间。但静态资源在使用时却会有些许性能的提升。

 

·         动态资源只能设置依赖属性只,而静态资源可以在任何地方使用。比如,我们可以声明一个逻辑资源把它当作一个元素来用,而动态资源却无法做到:

<Window x:Class="WpfApplication1.Window3"   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Title="Window3" Height="300" Width="300">

    <Window.Resources>

        <Button Background="Blue"  Margin="5" Height="28" x:Key="prev">

            <Image Height="21" Source="Images\previous.gif"></Image>

        </Button>

    </Window.Resources>

    <Grid>

        <Button Height="20" Width="70" Content="Content" />

        <StaticResource ResourceKey="prev" />

    </Grid>

 

</Window>

  Dynamic Resource – 动态资源

 

Static Resource不同的是,Dynamic Resource可以在程序运行时重新评估/计算资源来生成对应的对象/值,它支持向前引用,只要请求的key在整个应用程序内的任何Resources Dictionary定义过就可以被加载。如果有多个相同的key存在,则最后搜索到的资源为有效。

 

动态资源常用于以下情况:

·         资源直到运行时才能被取定其值的。这些包含想系统资源,或者通过用户交互/用户可以设定的值。例如你可以用Setter Property语法来引用一些系统资源像SystemColors, SystemFonts等,这些是真正的Dynamic Resource,因为他们是来自用户的运行环境。

·         Custom control中有创建/引用主题风格的需求.

·         在运行过程中调整(比如添加或者合并)ReourceDictionary.

·         需要向前引用的场景。

·         创建的Style的值与当前用户设定的主题或其他设定有关的。

·         运行过程中可能更改逻辑树的次序的。

下面的代码片段演示了如何在XAML中引用SystemFonts,这需要用DynamicResource标记:

<Style x:Key="SimpleFont" TargetType="{x:Type Button}">

    <Setter Property = "FontSize" Value= "{DynamicResource {x:Static SystemFonts.IconFontSizeKey}}"/>

    <Setter Property = "FontWeight" Value= "{DynamicResource {x:Static SystemFonts.MessageFontWeightKey}}"/>

    <Setter Property = "FontFamily" Value= "{DynamicResource {x:Static SystemFonts.CaptionFontFamilyKey}}"/>

</Style>