zoukankan      html  css  js  c++  java
  • WPF笔记(7)资源(Resources)

          如果我们需要对一些控件使用不同的字体大小时,我们可以通过硬编码的方式实现。但更好的方式是通过资源(Resource)。这里所说的资源并不是我们用用VS开发时的资源,那种资源一般是assembly 资源。

         WPF中的资源指的是本地定义的资源,因为它们是定义在XAML(或者C#)中,并且与一个元素或者应用程序绑定。特定的资源只会对被资源定义的控件和其派生子控件有用。我们可以认为它是XAML对C#静态只读字段(static read-only)的一种补偿。和静态只读字段一样,资源对象在运行时被创建并且被与其相关的控件共用。

         资源被存储在ResourceDictionary中,三个基础类:FrameworkElement,FrameContentElement,Application都定义了ResourceDictionary类型的字段Resources。在ResourceDictionary中的每一项都有一个key值来识别对象。通常情况下,这些key值都是字符串,XAML定义了一个属性x:key来定义资源的key值。

         从FrameworkElement继承的所有类都有一个Resources集合属性。我们一般总是将资源段定义在元素的属性开始部分。因为我们需要在引用它之前就进行定义。如:
    <StackPanel>
        <StackPanel.Resources>
            ...
        </StackPanel.Resources>
        ...
    </StackPanel>

         在Resources段中定义的资源可以被应用在整个StackPanel中,在Resources中的每个resource都是如下表示:

    <SomeType x:Key="mykey" ...>
        ...
    </SomeType>

         XAML元素可以引用通过扩展标记(markup extension)来引用key值表示的资源。扩展标记是XAML中使用的一个特殊字段。resources使用的特殊扩展标记是StaticResource。

    下面的示例是定义了两种字体大小,并将他们绑定到StackPanel中。

    Code

         在第二种表示FontSize的方法中,大括号(curly brackets)表示里面的表达式是扩展标记。实际上并没有StaticResource这个类。而是有一个从MarkupExtension继承的类StaticMarkupExtension包含了一个ResourceKey属性。StaticResource被表示为一个扩展标记,是因为它提供了一种在XAML中的处理事情的方法,这些事情通常只能被程序代码访问。StaticResourceExtension提供了通过key访问的值。

         另外还有两种扩展标记:x:Static和DynamicResource。它们也是用大括号包围。大括号表名在它里面有扩展标记,不允许有别的引用。

         同一个Resouces中的key值不能重复。但不同Resources中的key可以相同。定义同名的资源是一种很强大的技术,尤其是对Styles来说。Styles可以定义应用于多个元素的属性,以及元素属性改变以及事件发生时的处理方法。在实际的wpf编码中,Resources经常在Styles中使用。

         我们也可以通过代码将对象添加到资源集合中去。

    如:stack.Resources.Add("brushText", new SolidColorBrush(Colors.Blue));
    可以通过FindResource函数来查找特定key值的资源。

         XAML定义了一个扩展标记x:Static来引用静态属性或字段。如:Content="{x:Static SomeClass:SomeStaticProp}"。通常可以在C#代码中定义静态字段,然后在XAML中进行访问。但是一定要在XAML中引用该类。

         现在我们知道如何将对象定义为resources并且通过StaticResource标记来引用这些对象。也知道了如何定义静态属性和字段并通过x:Static来访问它。我们还要了解如何引用一个特定对象的示例字段和属性,这就需要使用DataBinding完成。

         当两个对象的属性需要关联变化时,我们需要用DynamicResource代替StaticResource。StaticResource和DynamicResource是两种不同的访问资源的方式,他们都需要通过key来访问对象。对于StaticResource,key值只用来访问对象一次,然后对象被保留。对于DynamicResource,key值被保留,然后对象在需要时访问返回。

         DynamicResource的主要目的是访问系统资源。不要过度的覆盖DynamicResource来达到过多的期望。在资源改变时并没有通知的概念。如果我们希望控件元素在其他对象的属性改变时改变自己。我们最好使用DataBinding。

     msdn:  http://msdn.microsoft.com/zh-cn/library/ms750613.aspx

     other:http://www.cnblogs.com/zlgcool/archive/2008/10/18/1314281.html

               http://www.cnblogs.com/YilingLai/archive/2007/01/25/605469.html

               http://www.rainsts.net/article.asp?id=757


     



     

  • 相关阅读:
    HDU 5583 Kingdom of Black and White 水题
    HDU 5578 Friendship of Frog 水题
    Codeforces Round #190 (Div. 2) E. Ciel the Commander 点分治
    hdu 5594 ZYB's Prime 最大流
    hdu 5593 ZYB's Tree 树形dp
    hdu 5592 ZYB's Game 树状数组
    hdu 5591 ZYB's Game 博弈论
    HDU 5590 ZYB's Biology 水题
    cdoj 1256 昊昊爱运动 预处理/前缀和
    cdoj 1255 斓少摘苹果 贪心
  • 原文地址:https://www.cnblogs.com/jyz/p/1296006.html
Copyright © 2011-2022 走看看