WFP资源

资源基础

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

资源的层次

<Windows.Resource>
  <ImageBrush x:key="backgroudBrush" ImageSource="happy.jpg"/>
</Windows.Resource>
<StackPanel>
   <Button Background="{StaticResource backgroudBrush}"/>
   <Button Background="{DynamicResource backgroudBrush}">
     <Button.Resources>
       <ImageBrush Key="backgroudBrush" ImageSource="Sad.jpg"/>
     </Button.Resources>
   </Button>
</StackPanel>

元素查找资源是从自己的资源集合中开始查找的,所以以上代码第一个按钮应用是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特性

   <ImageBrush x:Key="backgroundBrush" x:Shared="False" />

通过代码访问资源

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

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

应用程序资源

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

<Application
	...>
    <Application.Resources>
        <ImageBrush x:Key="BackgroundBrush" />
    </Application.Resources>
</Application>

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

系统资源

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

<label Foreground="{x:static SystemColors.WindowTextBrush}"/>

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

<label Foreground="{DynamicResource 
{x:static SystemColors.WindowTextBrushKey}}"/>

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

资源字典

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

<Application ...>
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/asd;component/Dictionary1.xaml" />
                <ResourceDictionary Source="pack://application:,,,/asd;component/Dictionary2.xaml" />
            </ResourceDictionary.MergedDictionaries>
            <ImageBrush x:Key="BackgroundBrush" Viewport="0,5,5,5" />
        </ResourceDictionary>
    </Application.Resources>
</Application>

若要附加新资源可在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实例作为键名 的资源引用。

posted @ 2022-04-23 21:06  蓝白永恒  阅读(73)  评论(0编辑  收藏  举报