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>
若是应用程序资源仍然不是查找资源的最后一站,元素还会查找系统资源。
系统资源
SystemColors、SystemFonts、SystemParameters 位于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实例作为键名 的资源引用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)