Sco*_*man 11 wpf resources interop elementhost winforms
我有一个Windows窗体应用程序需要在运行时托管WPF控件.我有基本的托管和交互完成(使用ElementHost控件),一切正常,直到我尝试做一些需要WPF控件来使用定义的一些自定义资源字典.(WPF控件及其所有资源字典都在同一个WPF控件库DLL中定义.)
一旦发生这种情况,我就会收到一堆看起来像这样的错误:
System.Windows.ResourceDictionary Warning: 9 : Resource not found; ResourceKey='DocumentHeaderInterestStyle'
Run Code Online (Sandbox Code Playgroud)
我找到了一个引用(链接因归档而显示为死,这 可能与最初引用的文章相同).谈到这一点,但似乎文章正在接近WPF方面的内容,但我真的不想对WPF控件进行更改,因为一切都在独立的WPF应用程序中运行.
如果实现这一目标的唯一方法是在WPF端进行更改,我可以进行这些更改(我不负责WPF控件库,但是那个也适用于同一家公司的人,所以这不是其他问题而不是花时间去做这些改变.)但是我希望能在WinForms方面做些什么才能让它发挥作用.
WPF控件库在项目中定义了一个名为"Default.xaml"的资源字典文件,其中包含以下属性:
构建操作:页面复制到输出目录:不要复制自定义工具:MSBuild:编译
独立的WPF应用程序在其App.xaml文件中包含以下条目:
<ResourceDictionary x:Uid="ResourceDictionary_1">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary x:Uid="ResourceDictionary_2" Source="/SmartClient.Infrastructure;component/Themes\Default.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
似乎控制库应该已经知道如何获取其资源.使用Resources.MergedDictionaries.Add()似乎它应该工作,但我在哪里获得现有字典的实例?
假设您知道需要什么资源(听起来像您知道的),您应该能够自己“注入”它们。就像是:
var wpfControl = new ...;
wpfControl.Resources.Add(...);
elementHost.Child = wpfControl;
Run Code Online (Sandbox Code Playgroud)
在您的问题中,您提到控件库中存在现有的资源字典。如果是这样,你可以这样做:
var wpfControl = new ...;
wpfControl.Resources.MergedDictionaries.Add(/* instance of existing dictionary */);
elementHost.Child = wpfControl;
Run Code Online (Sandbox Code Playgroud)