WPF类库项目如何在App.xaml中正确引用其他项目颜色资源?
类库类型WPF项目中App.xaml正确引用资源文件的解决方法
问题根因
WPF类库的App.xaml如果设为Page类型的Build Action,它不会像Windows Application项目的ApplicationDefinition那样自动作为全局资源入口加载,资源字典根本不会被合并到应用的资源上下文里,所以XAML里找不到资源。
可行解决方案
方案1:手动写代码加载资源字典
- 在KiwiWPFDemo类库里加个静态类,比如叫
ResourceBootstrapper:
public static class ResourceBootstrapper { static ResourceBootstrapper() { // 加载KiwiColor.xaml,路径要跟实际项目结构对应 var colorDict = new ResourceDictionary { Source = new Uri("/KiwiWPFControl;component/KiwiColor.xaml", UriKind.Relative) }; // 要是需要Generic.xaml也一起加载,就再加一个 var genericDict = new ResourceDictionary { Source = new Uri("/KiwiWPFControl;component/Themes/Generic.xaml", UriKind.Relative) }; // 把资源字典合并到当前应用的全局资源里 if (Application.Current != null) { Application.Current.Resources.MergedDictionaries.Add(colorDict); Application.Current.Resources.MergedDictionaries.Add(genericDict); } } // 用来触发静态构造函数的方法 public static void LoadResources() { } }
- 在引用这个类库的主项目启动时,先调用
ResourceBootstrapper.LoadResources(),比如在主项目的App.xaml.cs的OnStartup里加:
protected override void OnStartup(StartupEventArgs e) { KiwiWPFDemo.ResourceBootstrapper.LoadResources(); base.OnStartup(e); }
方案2:改App.xaml的Build Action并手动初始化App类
- 先把KiwiWPFDemo的
App.xaml的Build Action改成ApplicationDefinition,项目输出类型暂时设为Windows Application。 - 在
App.xaml里正常写资源引用:
<Application x:Class="KiwiWPFDemo.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/KiwiWPFControl;component/KiwiColor.xaml"/> <ResourceDictionary Source="/KiwiWPFControl;component/Themes/Generic.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application>
- 再把项目输出类型改回Class Library,此时
App.xaml的Build Action会保留为ApplicationDefinition。然后在主项目启动时初始化这个App类:
protected override void OnStartup(StartupEventArgs e) { new KiwiWPFDemo.App(); // 触发类库App的初始化,加载资源 base.OnStartup(e); }
方案3:把资源设为嵌入式资源用Pack URI引用
- 在KiwiWPFControl项目里,把KiwiColor.xaml的Build Action改成
Embedded Resource。 - 在KiwiWPFDemo的App.xaml里用Pack URI加载:
<ResourceDictionary Source="pack://application:,,,/KiwiWPFControl;component/KiwiColor.xaml"/>
- 确保主项目正确引用了KiwiWPFDemo和KiwiWPFControl类库,启动时类库程序集已加载。
关键注意点
- 资源路径一定要对应对,格式是
/类库程序集名;component/资源文件的相对路径,或者用完整的Pack URI。 - 类库本身没有独立的应用入口,所以App.xaml里的资源不会自动加载,必须靠代码手动触发加载逻辑。
内容的提问来源于stack exchange,提问作者Orenoai
相关产品推荐
相关产品推荐

