什么时候对WPF控件实际使用Freeze()



我应该将我创建的或直接指定为背景的所有笔刷设置为"冻结"吗?我不修改的其他用户控件呢?

Freezable提供一个Changed事件,通知观察者对对象的任何修改。冻结Freezable可以提高其性能,因为它不再需要在更改通知上花费资源。冻结的Freezable也可以在线程之间共享,而未冻结的Freeizable则不能。

由此看来,如果我的应用程序从未对创建的笔刷进行任何更改,那么无论我是否设置冻结它,在性能方面都没有区别。我说得对吗?

尽可能地,您应该在一个或多个资源字典中放置任何可以看到显著使用的笔刷。

只要你不让画笔的一部分依赖于某个变量,这些就会被自动冻结。将它们合并到app.xaml中,以便在整个应用程序中使用。

对于大多数WPF开发人员来说,这是他们遇到的最常见的冻结用法,并且是自动完成的。

如果使用未冻结的可冻结对象,则会订阅更改后的事件,以便对视图进行潜在更改。如果冻结它,则不会订阅此事件,因此效率更高。不过,在你可能注意到这样的问题之前,你必须使用大量未冻结的freezables。

如果你做了很多图形处理,比如写游戏,那么将自由变量(比如动态构建的几何图形(从背景线程传递到UI可能会很有趣,也很重要。但是,您可以编写大量的业务应用程序,而不需要做这种事情。

你可以冻结的东西非常有限——它们必须继承自freezable。用户控件没有
如果你读了这份清单,你可能会花更多的时间思考"那是什么",而不是"啊,是的,我可以看到自己冻结了一个…拇指按钮信息"。

https://learn.microsoft.com/en-us/dotnet/api/system.windows.freezable?view=netframework-4.8

我应该将我创建的或直接指定为背景的所有笔刷设置为冻结吗?

是的,假设您不打算修改它们。这使系统不必监视它们的修改,也不必更新它们在后台使用的相应非托管资源。

由于冻结Freezable对象提供了这种性能优势,因此只要知道它们不会被修改,就冻结它们被认为是一种最佳做法。

例如,如果在后台线程上创建Brush,则必须将其冻结,才能将其分配给UI线程上UIElement的属性。

请确保按照文档中的说明检查CanFreeze属性的值。

可以使用PresentationOptions:freeze属性冻结XAML资源。

最新更新