当前位置: 首页 > 编程语言 > .NET综合 > 正文

WPF学习之资源-Resources(6)

时间:2010-07-18 cnblogs zlgcool Allan

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异常。

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

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

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

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

<Window x:Class="WpfApplication1.Window3"  xmlns=""
  xmlns:x=""
  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>

· 当你在XAML中使用StaticResource时,是不支持Forward Reference的,也就是说任何资源必须在XAML文件中声明之后才可以使用。如果是在同一个元素中定义,则只能使用Dynamic Resource。

<Window x:Class="WpfApplication1.Window3"
  xmlns=""
  xmlns:x=""
  Title="Window3" Height="300" Width="300" Background="{DynamicResource winBackground}">
  <Window.Resources>
    <Button Background="Blue" Margin="5" Height="28" x:Key="prev">
      <Image Height="21" Source="Images\previous.gif"></Image>
    </Button>
    <LinearGradientBrush x:Key="winBackground" StartPoint="0,0" EndPoint="1,1">
      <GradientStop Color="Blue" Offset="0"></GradientStop>
      <GradientStop Color="White" Offset="0.5"></GradientStop>
      <GradientStop Color="Red" Offset="1"></GradientStop>
    </LinearGradientBrush>
  </Window.Resources>
  <Grid>
    <Button Height="20" Width="70" Content="Content" />
    <StaticResource ResourceKey="prev" />
  </Grid>
</Window>