我们的设计师正在使用Blend来设计我们的WPF应用程序。当他为属性选择本地资源时,Blend会将其应用为{DynamicResource}
而不是{StaticResource}
。我的猜测是Blend这样做是因为它可以让应用程序在运行时重新定义,而不必重新启动它。
我的问题是:此额外查找是否会产生显着的性能成本?我们是否应该要求设计人员返回并手动将这些动态更改为静态?
这是一个很好的SO问题,解释了类型之间的区别:What's the difference between StaticResource and DynamicResource in WPF?
答案 0 :(得分:30)
不幸的是,这是一个很难直接比较相对性能的情况,因为任何降级都会出现在WPF引擎的深处。在WPF的早期阶段,StaticResource的使用是推荐的标准性能调整之一,我们倾向于在我们的组织中非常严格地遵循它并将其推荐给其他人。我真的很恼火Blend做了动态的一切,尽管这有助于它在设计时正确地从其他文件中提取资源。
随着时间的推移,我对此的看法发生了变化,这在某种程度上取决于个人经验,但也有来自Microsoft Blend团队成员的反馈。您可能已经意识到,Blend完全用WPF编写,并且具有完整的备用主题(Light),可以在应用程序运行时动态切换。这是可能的,因为他们使用DynamicResource来完成他们的所有样式。据他们说,这并没有真正导致他们任何真正的性能问题。鉴于Blend可能是目前使用最广泛的WPF应用程序,我倾向于对其观点给予重视。
要考虑的另一件事是DynamicResource的实际用途。动态更改样式的能力是其中的一部分,但是它在构建资源层次结构时提供的灵活性可以使管理共享样式变得更加容易。我确定你遇到了StaticResource引用在运行时爆炸的情况,因为它指向的资源要加载到层次结构的不同分支中。
显然,StaticResource对于指向您知道将在适当的时间可用的特定密钥非常有用。当手写XAML时,我仍然倾向于一直使用它。但是考虑到让设计师在Blend中生成XAML所带来的工作效率,您可能获得的任何小的性能提升都可能不值得将所有内容维护为静态。
答案 1 :(得分:6)
据说存在性能差异,但它是否“重要”将取决于发生了多少动态查找。除非你有成千上万的DynamicResource引用,否则它可能不会引人注目;如果动态资源的表现比静态资源差得多,我怀疑Blend会更加保守地生成它们。
事实上,当我运行一个天真的测试时,我发现DynamicResource比StaticResource运行更快的违反直觉的结果(使用3000个资源引用,当我使用DynamicResource获取所有内容时,我看到加载时间大约200ms 。对于StaticResource,大约400ms。
这是一个不切实际的测试,原因有很多:所有引用都是相同的,我在调试器下运行等等。但它表明,努力改变Blend输出“仅仅是在案例“ - 如果你注意到减速,它可能不一定是DynamicResource引用的错误 - 总是测量!
答案 2 :(得分:1)
不幸的是,如果您将动态资源更改回静态,它将破坏Blend。这似乎是真的,尤其是当使用引用动态资源的UserControl时,如果将它们更改为静态,则当在Blend中的另一个控件内托管时,控件将不会呈现。