我有一个非常奇怪的问题,我无法在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天时间在监视器上敲我的头,什么都没有,我尝试的一切都失败了。尽管当然打破了监视器。 想出来......
问候。
答案 0 :(得分:0)
确保以下事项