即使资源存在,也无法找到资源

时间:2012-02-03 13:50:29

标签: asp.net wpf resources

我有一个非常奇怪的问题,我无法在Wpf应用程序中修复。我们构建了一个包含许多有用组件的公共库,其中一个是具有公司风格的奇特MessageBox。有三个词典几乎包含了我们需要的所有内容:

<ResourceDictionary Source="/Library;component/Style/Styles.xaml" />
<ResourceDictionary Source="/Library;component/Themes/Globals.xaml"/>
<ResourceDictionary Source="/Library;component/Themes/Controls/Button/Template.xaml"/>

MessageBox进入Globals.xaml有一个页脚,页脚使用Template.xaml中的模板。它工作得很好但不是一个案例。我有一个主窗口,可以动态创建一个插件并打开一个窗口。此窗口是通过反射加载的常规Window Wpf应用程序。 打开MessageBox的方法与Resource Dictionaries在同一个DLL中。

如果我从插件中调用此MessageBox方法,则会抛出异常,因为找不到“Footer”。我在

之前设置了一个断点
window.ShowDialog();

我看到MergedDictionaries在窗口中是空的。到处都是空的,只有这个MessageBox的所有者包含那些资源。做

window.FindResource("key");

按预期获取空值。但是,如果我在打开对话框之前使用此代码行手动复制合并的字典:

foreach (var dict in owner.Resources.MergedDictionaries)
{
    window.Resources.MergedDictionaries.Add(dict);
}

然后查找window.FindResource(“key”)我可以看到样式,但即使它继续抛出异常:

找不到名为“{Footer}”的资源。资源名称区分大小写。

在此行MessageBox中使用了页脚样式:

<StatusBar Style="{StaticResource Footer}" DataContext="{Binding ElementName=window}"...

我也尝试将此资源声明为库中的DialogWindow,即使我不允许更改它:

<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Library;component/Themes/Generic.xaml" />
<ResourceDictionary Source="/Library;component/Themes/Globals.xaml"/>
<ResourceDictionary Source="/Library;component/Themes/Controls/Button/Template.xaml"/>
</ResourceDictionary.MergedDictionaries>

我已经有2天时间在监视器上敲我的头,什么都没有,我尝试的一切都失败了。尽管当然打破了监视器。 想出来......

问候。

1 个答案:

答案 0 :(得分:0)

确保以下事项

  • 资源字典Build Action设置为Page
  • 每个引用Style的项目都有一个库引用(即使你将Dictionary放在App.xaml中,如果一个项目没有引用参考资源库那么它就不会找到它
  • 将MergedDictionaries放在App.xaml中(或在您想要使用它们的特定页面中)