2010-09-02 65 views
3

在我們的項目中,我們擁有許多不同程序集(在具有100個視圖的單個解決方案中多達40個程序集)的視圖和控件。我們希望將一個皮膚應用於單個皮膚裝配體的所有視圖,我們可以使用不同的皮膚裝配體換出一個皮膚裝配體以應用不同的皮膚(不一定在運行時,這可以在編譯時完成),只需要更改一個皮膚幾行代碼。這裏是踢球者...我們希望它能夠在Visual Studio 2008 Designer中正確顯示。在Visual Studio 2008 Designer中工作的WPF皮膚庫

我們目前有一個運行時解決方案,通過將外觀的主資源字典合併到Application.Resources中來應用合適的外觀,但Visual Studio設計器不在依賴程序集中的視圖上顯示該外觀。

我們可以將皮膚的資源字典合併到每個視圖的Window.Resources中,但是如果我們想換出皮膚,這是一個性能問題,並且需要很多更改。

我已經看過在主題級應用樣式,但要在主題級使用樣式,則需要指定ComponentResourceKey,並在主題部件中使用對類型的強類型引用。這需要每一個視圖指定皮膚所在的命名空間,並且再次是換出皮膚的主要重構。

其他想法?

回答

3

您可以使用附加的行爲合併的資源字典的每一個窗口/頁/ UserControl的資源,如:

<Page my:Skinlibrary.Attach="True"> 
    <!-- stuff goes here --> 
</Page> 

您可以配置附加的行爲相同的資源字典實例始終合併附加元素資源。爲此,您只需要初始化資源字典一次,也許在一個靜態的ctor中。

假設你有準備一個名爲「_staticResourceDictionaryThatHoldsMySkin」變量的資源,然後在附加屬性的「的PropertyChanged」回調,你可以做到這一點把它合併到附加的Windows:

static void OnAttachChanged(DependencyProperty sender, DependencyPropertyChangedEventArgs e) 
{ 
    (sender as FrameworkElement).Resources.MergedDictionaries.Add(_staticResourceDictionaryThatHoldsMySkinResources); 
} 

這將使您能夠在編譯時更改皮膚,只需更改SkinLibrary文件即可。您也可以通過首先檢查配置文件來加載資源字典。

以我的經驗,在Visual Studio設計師中,皮膚將在2008年和2010年都能正常顯示。