我在開發基於使用MEF的插件的WPF應用程序時遇到了問題。
每個插件都可以有自己的ResourceDictionary
,其中包含不同的樣式和顏色。爲了讓我的主應用程序(加載所有插件)知道所有不同的ResourceDictionaries
,我爲每個字典創建了一個類,並使用[Export(typeof(ResourceDictionary))]
屬性修飾了類。在我的主應用程序中,我導入所有導出的ResourceDictionaries
並將它們添加到Application.Current.Resources.MergedDictionaries
。到目前爲止一切工作正常。
這是困擾我的唯一的事情是,引用在我爲了使用DynamicResource
插件的視圖中的一個資源時,避免VisualStudio中表現出這樣的錯誤消息:在xaml中使用AssemblyShortName以外的任何參考引用當前程序集
The resource ... could not be resolved.
即使在編譯時和運行時一切正常。
要workround只使用DynamicResource
(因爲DynamicResource
調用比StaticResource
電話更貴)的這個問題,我在每一個插件視圖添加ResourceDictionaries
我使用它們:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/resources/ColorDictionary.xaml" />
<ResourceDictionary Source="/resources/StyleDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
現在因爲我引用這些相對路徑的插件程序集我在主應用程序中收到錯誤消息:
It can't find the file "resources/StyleDictionary.xaml"
這是可以理解的,因爲我的主應用程序沒有這樣的文件。
我們避免這個錯誤我發現了一個解決方案,它是不是:
<ResourceDictionary Source="/resources/ColorDictionary.xaml" />
我的手在當前插件組裝這樣的AssemblyShortName
:
<ResourceDictionary Source="/MyAssemblyShortName;component/resources/SymbolDictionary.xaml" />
做這樣當無出現錯誤並且所有資源都正常加載。但是如果AssemblyShortName
隨着時間的推移發生了變化(該項目還處於開發階段)。如果是這樣,我必須找到所有這些引用並手動更改它們。
TL; DR /問題:
有另一種方法,而不是使用AssemblyShortName
引用當前組件在XAML絕對路徑。正因爲如此:
<ResourceDictionary Source="/My.Namespace.PluginAssembly;component/resources/SymbolDictionary.xaml" />
給我的錯誤:
Assembly is not referenced by this project.
(當然不是因爲 「集結號」 是 「這個項目」)
- 爲什麼主要應用有直接dependen諸如插件中的資源字典等項目?插件的整體思想是可以通過插件增強應用程序的行爲,而無需更改應用程序的代碼。否則,你可能會讓他們定期圖書館並丟棄MEF。更好的是,插件完全獨立,不僅僅是字典,還有任何視圖。 – MickyD
在主應用程序中引用'ResourceDictionaries'是從MEF封裝的。所以當我添加一個新插件時,我不必在主應用程序中更改任何代碼。除此之外,如果不將插件字典合併到主應用程序中,則在運行時在各個插件中使用字典的值時,不會找到引用。 – croxy