使用主机应用程序资源的 WPF 应用程序插件

WPF application plugin using resources from host application

我遇到了与 this 问题类似的情况。然而,用户对他们如何能够让插件在 运行 时间利用主机应用程序的静态资源感到困惑。那是我的绊脚石。

让我们呼叫主持人"K"。目前,我创建了一个名为 KResources.xaml 的资源字典,其中包含应用程序的所有资源(app.xaml 只是合并了这个字典并称之为一天)。

在我的插件中,我正在创建一个视图 V,它需要使用 KResources 字典。这就是我目前正在尝试的:

<UserControl.Resources>
 <ResourceDictionary>
  <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/K;component/Resources/KResources.xaml" />
  </ResourceDictionary.MergedDictionaries>
 </ResourceDictionary>
</UserControl.Resources>

我也尝试过以下语法:

<ResourceDictionary 
    Source="pack://application:,,,/K;component/Resources/KResources.xaml" />

编译顺利,我的 V.xaml 文件识别了资源,但我在创建此视图的 运行 时遇到异常:

System.Windows.Markup.XamlParseException occurred
HResult=-2146233087
LineNumber=19
LinePosition=8
Message='The invocation of the constructor on type 'K.UI.Infrastructure.CaliburnBootstrapper' that matches the specified binding constraints threw an exception.' Line number '19' and line position '8'.
Source=PresentationFramework
StackTrace:
   at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
InnerException: 
   HResult=-2147024809
   Message=An item with the same key has already been added.
   Source=mscorlib
   StackTrace:
        at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
        at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
        at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
        at Caliburn.Micro.AssemblySourceCache.<Install>b__4(Type t)
        at Caliburn.Micro.EnumerableExtensions.Apply[T](IEnumerable`1 enumerable, Action`1 action)
        at Caliburn.Micro.AssemblySourceCache.<Install>b__0(Object s, NotifyCollectionChangedEventArgs e)
        at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
        at Caliburn.Micro.BindableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
        at Caliburn.Micro.BindableCollection`1.<>c__DisplayClasse.<AddRange>b__d()
        at Caliburn.Micro.XamlPlatformProvider.OnUIThread(Action action)
        at Caliburn.Micro.BindableCollection`1.AddRange(IEnumerable`1 items)
        at Caliburn.Micro.BootstrapperBase.StartRuntime()
        at Caliburn.Micro.BootstrapperBase.Initialize()
        at K.UI.Infrastructure.CaliburnBootstrapper..ctor() in C:\Dev\K\source\K.UI\Infrastructure\CaliburnBootstrapper.cs:line 44

Message=已添加具有相同键的项目。 脱颖而出。

如有任何见解,我们将不胜感激。提前致谢!

所以事实证明,完全省略合并字典代码导致我需要的静态资源无论如何都在 运行 时间正确定位。缺点是在设计时 IDE 会突出显示它们,就好像它们不存在一样。

这让我和这个问题处于同一点: