2012-02-03 107 views
0

我有一个非常奇怪的问题,我无法在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(“钥匙”),我可以看到的风格,但即使它继续抛出一个异常:

找不到名为“{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天在监视器上敲我的头,没有什么,我试过的所有东西都失败了。尽管当然会破坏显示器。 跑出想法...

问候。

回答

0

使确保以下几点

  • 资源字典生成操作设置为页面
  • 每个项目都引用样式有一个图书馆参考它(即使你把应用程序的字典。 XAML如果不引用的资源库,然后一个项目,它不会发现它
  • 将在App.xaml中的MergedDictionaries(或特定页面,您要使用它们)
+0

感谢您的答但我做到了。最奇怪的是我可以调试应用程序并使用“FindResource”方法检查是否加载了该资源。即使我强制它不能通过MessageBox找到。 – 2012-02-03 18:59:23

+0

对不起,我不明白我的理解。 这是什么意思: 引用Style的每个项目都有一个库引用(即使您将App.xaml中的Dictionary放入App.xaml中,如果该项目没有引用Resources Library,那么它也不会找到它。如何添加对资源库的引用?是否只是指项目选项下的内容? – 2013-08-09 00:14:25