WFP资源


资源基础

WPF程序在代码中以及在标记中的各个位置定义资源,具有高效性、可维护性、适应性的优点。

资源的层次


  


   

元素查找资源是从自己的资源集合中开始查找的,所以以上代码第一个按钮应用是happy的背景图,第二个按钮是Sad的背景图。

静态资源和动态资源

静态资源和动态资源是资源的加载方式,资源是可以修改的。

ImageBrush brush=(ImageBrush)this.Resources["backgroudBrush"];
brush.Viewport=new Rect(0,5,5,5);

以上代码改变画刷平铺图像的尺寸,不管是静态还是动态资源使用都会更新界面。这是应为Brush类继承自Freezable类,Freezbale类具有变化跟踪特效,无论何时在WPF中改变画刷,所用使用该画刷的控件都会自动更新。

静态资源与动态资源之间的区别:

静态资源只从资源集合中获取对象一次,根据对象的类型(以及对象的使用方式),对象的任何变化都可能被立即注意到。

动态资源在每次需要资源时都会去资源集合中查找对象,这意味着在同一键放置一个全新的对象,动态资源会引用改变化。

this.Resources["backgroudBrush"] = new SolidColorBrush(Colors.Blue);

动态资源应用新的变化,而静态资源不知道该资源已经被替换,它仍然使用原来的资源。

不应过度使用动态资源,极少数情况下动态资源用于提高第一次窗口加载是的性能,这是因为静态资源总是在创建窗口时加载,而动态资源是在第一次使用它们时加载。除非资源非常大且复杂,否则这样做没有任何益处。

非共享资源

关闭共享行为使用Shared特性

   

通过代码访问资源

使用FrameworkElement.FindResource()FrameworkElement.TryFindResource()方法。建议使用TryFindResource(),差不到资源时返回null而不会抛出异常。

  Button btn = sender as Button;
  ImageBrush brush = (ImageBrush)btn.TryFindResource("backgroundBrush");

应用程序资源

窗口不是查找资源的最后一站,WPF会继续检查应用程序定义的资源集合,这些资源是再App.xaml文件标记中定义的资源。


    
        
    


若是应用程序资源仍然不是查找资源的最后一站,元素还会查找系统资源。

系统资源

SystemColorsSystemFontsSystemParameters 位于System.Windows,此命名空间中的版本是WPF的一部分,它们使用正确的数据类型并且支持资源系统。System.Drawing命名空间下也有SystemColors、SystemFonts两个类,他们是Windows窗体的一部分。

此方式引用改变Windows颜色,不会更新Label的颜色。

定义动态资源,从资源集合中查找, 此方式改变系统颜色,Label会更新颜色。

资源字典

用于储存项目之间可共享资源,XAML文档。使用资源字典方式如下,Window中使用相同。


    
        
            
                
                
            
            
        
    

若要附加新资源可在ResourceDictionary.MergedDictionaries之前或之后添加。

程序集之间共享资源

在代码中使用程序集资源

ResourceDictionary resourceDictionary = new ResourceDictionary();
resourceDictionary.Source = new Uri("CustomControlLibrary;component/Dictionarys/Dictionary1.xaml",UriKind.Relative);

Button btn= sender as Button;
btn.Background = (ImageBrush)resourceDictionary["backgroundBrush"];

还有以ComponentResourceKey实例作为键名 的资源引用。

WPF