使用主机应用程序资源的 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 会突出显示它们,就好像它们不存在一样。
这让我和这个问题处于同一点:
我遇到了与 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 会突出显示它们,就好像它们不存在一样。
这让我和这个问题处于同一点: