2017-04-24 15 views
2

我在開發基於使用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.

(當然不是因爲 「集結號」 是 「這個項目」)

+2

- 爲什麼主要應用有直接dependen諸如插件中的資源字典等項目?插件的整體思想是可以通過插件增強應用程序的行爲,而無需更改應用程序的代碼。否則,你可能會讓他們定期圖書館並丟棄MEF。更好的是,插件完全獨立,不僅僅是字典,還有任何視圖。 – MickyD

+0

在主應用程序中引用'ResourceDictionaries'是從MEF封裝的。所以當我添加一個新插件時,我不必在主應用程序中更改任何代碼。除此之外,如果不將插件字典合併到主應用程序中,則在運行時在各個插件中使用字典的值時,不會找到引用。 – croxy

回答

1

Is there another way instead of using the AssemblyShortName to reference the current assembly as an absolute path in XAML.

不,我不知道也這樣覺得。程序集的名稱是包URI的一部分:https://msdn.microsoft.com/en-us/library/aa970069(v=vs.110).aspx

如果你不希望找到所有引用和手動修改它們當您更改程序集的名稱,你既可以完全避免改變組件的名稱,或以編程方式添加的資源字典:

Set up application resources from code

然後,你可以很容易地得到程序集的名稱動態:單從設計的角度來看

Getting assembly name

+0

以編程方式設置「ResourceDictionaries」的問題在於XAML-Designer會拋出無法解析引用資源的錯誤(即使所有資源都在運行時重新解析)。是否有機會以編程方式設置「ResourceDictionaries」,並讓XAML-Designer找到資源?我不想挖掘數百條錯誤消息來找到相關的錯誤消息。 – croxy

+0

我不知道。在我看來,XAML設計師根本不是非常有用。我總是禁用它:http://blog.spinthemoose.com/2013/03/24/disable-the-xaml-designer-in-visual-studio/。它不能處理運行時可能發生的所有事情,而且我也不會花太多時間去嘗試解決設計問題。無論如何,它註定要失敗。每個嚴肅的WPF開發人員都應該學習XAML和.NET編程語言:)設計師是爲設計師設計的。 – mm8

+0

好的,非常感謝你的意見。到目前爲止,我從來沒有考慮過停用XAML設計器,因爲它從一開始就在那裏。我從來沒有真正需要它。我想這是純粹的習慣,讓它激活。我想我必須重新考慮一些人生的決定;)。 – croxy