拆分WPF资源字典

拆分WPF资源字典,wpf,resourcedictionary,Wpf,Resourcedictionary,我有一个WPF应用程序,由大约七个用户控件组成,每个控件上都有各种不同的控件(文本框、组合框、单选按钮等) 在整个应用程序中,我应用了一组取自CodePlex上WPF主题的控件样式,但我注意到应用这些样式后,应用程序的速度有点慢。包含我所有风格的ResourceDictionary的代码大小接近300kb 如果将样式拆分到多个资源字典中,并且仅合并每个usercontrol所需的样式,而不是合并所有控件样式(即使未使用它们),那么会有好处吗 WPF如何将样式加载到内存中?如果需要,或者整个Res

我有一个WPF应用程序,由大约七个用户控件组成,每个控件上都有各种不同的控件(文本框、组合框、单选按钮等)

在整个应用程序中,我应用了一组取自CodePlex上WPF主题的控件样式,但我注意到应用这些样式后,应用程序的速度有点慢。包含我所有风格的ResourceDictionary的代码大小接近300kb

如果将样式拆分到多个资源字典中,并且仅合并每个usercontrol所需的样式,而不是合并所有控件样式(即使未使用它们),那么会有好处吗


WPF如何将样式加载到内存中?如果需要,或者整个ResourceDictionary在启动时加载到内存中?

当从XAML(或BAML)创建对象时,
XamlReader
反序列化XAML的所有内容。它找到的每个XAML元素都会创建一个对象的实例,因此
UserControl.Resources
元素下的
Style
元素会生成
Style
对象,这些对象会在对象反序列化时添加到用户控件的资源字典中。(实际上比这要复杂一点,因为XAML反序列化显然有异步的部分,但就本文讨论的目的而言,这已经足够接近了。)

重要的是要了解
资源
不是静态属性。用户控件的每个实例都有自己的资源字典。如果在用户控件的XAML中放置300个样式,并创建100个用户控件,则将创建30000个
Style
对象。无论您是否使用合并词典,这都是正确的

如果你的资源字典像你说的那么大,那么到目前为止最好的办法就是把它放到应用程序的
Resources
属性中。这样,您只需为反序列化每个对象一次付出代价