zoukankan      html  css  js  c++  java
  • Dynamic Resource – 动态资源

      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="Imagesprevious.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>

     

  • 相关阅读:
    ssh
    ssh免密码登陆
    滑雪[dp]
    Help Jimmy[dp]
    动态规划 [子序列问题]
    最佳加法表达式 [dp]
    求排列的逆序数[归并排序]
    输出前m大个数,时间复杂度O(n+mlog(m)) [快排]
    不会递归?五道例题教你如何递归
    函数模板的琐碎笔记
  • 原文地址:https://www.cnblogs.com/sjqq/p/6782101.html
Copyright © 2011-2022 走看看