1

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

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

通过将样式拆分为多个资源字典并仅合并每个用户控件所需的样式而不是所有控件样式,即使它们没有被使用,是否会有好处。

WPF 如何将样式加载到内存中?需要时还是在启动时将整个 ResourceDictionary 加载到内存中?

4

1 回答 1

2

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

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

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

于 2010-09-06T03:58:17.947 回答