当在WPF中使用画笔、模板和样式等资源时,它们可以指定为StaticResources

<Rectangle Fill="{StaticResource MyBrush}" />

或者作为一个动态资源

<ItemsControl ItemTemplate="{DynamicResource MyItemTemplate}"  />

大多数时候(总是?),只有一个工作,而另一个将在运行时抛出异常。但我想知道为什么:

主要的区别是什么?比如对内存和性能的影响 WPF中是否存在“笔刷总是静态的”和“模板总是动态的”之类的规则?

我认为静态和动态之间的选择并不像看起来那么随意……但我看不出规律。


当前回答

发现所有答案都很有用,只是想再添加一个用例。

在复合WPF场景中,您的用户控件可以通过将任何其他父窗口/控件(将承载此用户控件)中定义的资源引用为DynamicResource来使用。

正如其他人提到的,Staticresource将在编译时查找。用户控件不能引用在主机/父控件中定义的资源。不过,在这种情况下可以使用DynamicResource。

其他回答

StaticResource将在对象构造时被解析。 DynamicResource将在每次控件需要该资源时被计算和解析。

动态资源的重要效益

如果应用程序启动需要很长时间,你必须使用动态资源, 因为静态资源总是在创建窗口或应用程序时加载,而动态资源 在第一次使用时加载。

然而,除非您的资源非常大,否则您不会看到任何好处 复杂。

发现所有答案都很有用,只是想再添加一个用例。

在复合WPF场景中,您的用户控件可以通过将任何其他父窗口/控件(将承载此用户控件)中定义的资源引用为DynamicResource来使用。

正如其他人提到的,Staticresource将在编译时查找。用户控件不能引用在主机/父控件中定义的资源。不过,在这种情况下可以使用DynamicResource。

主要的区别是什么?比如对内存和性能的影响

当底层对象发生变化时,静态资源和动态资源之间的区别就显现出来了。如果在Resources集合中定义的Brush在代码中被访问并设置为不同的对象实例,Rectangle将不会检测到此更改。

静态资源通过引用元素检索一次,并在资源的生命周期内使用。而DynamicResources则在每次使用时进行检索。

动态资源的缺点是它们往往会降低应用程序的性能。

WPF中是否存在“笔刷总是静态的”和“模板总是动态的”之类的规则?

最好的做法是使用静态资源,除非有特定的原因,比如你想在后面的代码中动态地改变资源。当你使用systembrush, systemfonts和System Parameters时,你会想要使用动态资源的另一个例子。

在应用程序实际运行之前加载XAML期间,将解析一个StaticResource并将其分配给属性。它只会被赋值一次,对资源字典的任何更改都会被忽略。

DynamicResource在加载期间将表达式对象分配给属性,但直到运行时向表达式对象请求值时才实际查找资源。这将延迟查找资源,直到在运行时需要它。一个很好的例子是对稍后在XAML中定义的资源的前向引用。另一个例子是直到运行时才存在的资源。如果源资源字典被更改,它将更新目标。