什么时候真正将Freeze()用于WPF控件?

是否应该将我创建或直接指定为背景的所有画笔设置为“冻结”?那我不修改​​的其他用户控件呢?

  

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

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

kakasned 回答:什么时候真正将Freeze()用于WPF控件?

  

我应该将我创建或直接分配为背景的所有画笔设置为“冻结”吗?

是的,假设您不打算修改它们。这样可以避免系统必须监视它们的修改,更新它们在引擎盖下使用的相应非托管资源。

由于冻结Freezable对象可提供此性能优势,因此,当您知道它们不会被修改时,冻结它们是一种最佳做法。

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

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

您可以使用PresentationOptions:Freeze Attribute冻结XAML资源。

,

在可能的情况下,您应该尽可能放置一个或多个资源字典中会大量使用的画笔。

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

对于大多数WPF开发人员而言,这是冻结过程最常见的用法,它们会自动完成。

如果您使用未冻结的可冻结对象,则将订阅已更改的事件,以便将可能的更改驱动到视图。如果冻结它,则将不预订此事件,因此效率更高。不过,在您可能会注意到这种问题之前,您将不得不使用大量未冻结的可冻结对象。

如果您进行了大量图形处理(例如编写游戏),则将诸如动态构建的几何图形之类的可冻结对象从后台线程传递到UI可能很有趣并且意义重大。但是,您可以编写许多业务应用程序,而无需执行此类操作。

您可以冻结的东西非常有限-它们必须从freezable继承。用户控件没有。
如果您阅读该列表,则可能会花更多的时间在思考“那是什么”而不是“是的,我可以看到自己冻结了... ThumbButtonInfo”。

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

本文链接:https://www.f2er.com/3165723.html

大家都在问