2010-09-05 61 views
1

我有一個WPF應用程序,由大約7個用戶控件組成,每個用戶控件在每個控件上都有各種不同的控件(文本框,組合框,單選按鈕等)。分割WPF ResourceDictionary

在整個應用程序中,我應用了從CodeFlex上的WPF主題獲取的一組控件樣式,但是我注意到應用程序自應用這些樣式後出現了一些放緩現象。包含我所有樣式的ResourceDictionary在代碼大小中的權重接近300kb。

通過將樣式分割爲多個資源字典並僅合併每個用戶控件所需的樣式,而不是所有控件樣式(即使它們未被使用),都能獲得好處。

WPF如何將樣式加載到內存中?需要時還是整個ResourceDictionary在啓動時加載到內存中?

回答

2

當從XAML(或BAML)創建對象時,XamlReader將對所有XAML的內容進行反序列化。它發現的每個XAML元素都會創建一個對象的實例 - 因此UserControl.Resources元素下的Style元素會生成Style對象,該對象在對象被反序列化時被添加到用戶控件的資源字典中。 (它實際上比這更復雜一點,因爲顯然XAML反序列化的部分是異步的,但對於本次討論而言它足夠接近。)

重要的是要明白Resources不是靜態屬性。用戶控件的每個實例都有自己的資源字典。如果您在用戶控件的XAML中放置了300個樣式,並且您創建了100個用戶控件,那麼您將創建30,000個Style對象。無論您是否使用合併字典,情況都是如此。

如果您的資源字典與您所說的一樣巨大,那麼最好的做法是將其放入應用程序的Resources屬性中。這樣你只支付反序列化每個對象一次的代價。