如何冻结无法冻结的可冻结对象在我的场景中,我想先冻结一个不变的BitmapCacheBrush,然后再在后台任务中渲染它。不幸的是,我收到错误“ThisFreezablecannotbefrozen”。是否有任何解决方法或hacky方法来冻结也不可冻结的对象?也许可以通过在反射上设置正确的属性来实现这一点?先感谢您。编辑:(我的示例代码请求)publicstaticclassext{publicstaticasyncTaskRenderAsync(thisVisualvisual){varbounds=VisualTreeHelper.GetDescendantBounds(visual);varbitmapCacheBrush=newBitmapCacheBrush(视觉);bitmapCacheBrush.BitmapCache=newBitmapCache();//我们需要在此处断开视觉连接以使可冻结对象变为可冻结对象:)。当然这会让我们的渲染变成空白//bitmapCacheBrush.Target=null;bitmapCacheBrush.Freeze();varbitmapSource=awaitTask.Run(()=>{varrenderBitmap=newRenderTargetBitmap((int)bounds.Width,(int)bounds.Height,96,96,PixelFormats.Pbgra32);vardVisual=newDrawingVisual();使用(DrawingContextcontext=dVisual.RenderOpen()){context.DrawRectangle(bitmapCacheBrush,null,newRect(newPoint(),newSize(bounds.Width,bounds.Height)));}renderBitmap.Render(dVisual);renderBitmap.Freeze();返回renderBitmap;});返回位图源;首先,你需要弄清楚为什么你不能冻结它。进入注册表并将ManagedTracing设置为1(如果必须,请键入REG_DWORD)。我建议您将它添加到regedit中的收藏夹中,以便在需要打开/关闭时可以快速找到它。HKEY_CURRENT_USERSOFTWAREMicrosoftTracingWPFManagedTracing当您尝试冻结BitmapCacheBrush或检查bool属性BitmapCacheBrush.CanFreeze时,您将在VisualStudio的“输出”选项卡中收到警告,告诉您问题所在。我根据https://blogs.msdn.microsoft.com/llobo/2009/11/10/new-wpf-features-cached-composition/中的代码编写了一个测试用例。它给我的警告是:System.Windows.FreezableWarning:2:CanFreezereturnedfalsebecausetheDependencyPropertyonFreezablehasaDispatcherObjectvaluewiththreadaffinity;Freezable='System.Windows.Media.BitmapCacheBrush';可冻结的.HashCode='29320365';Freezable.Type='System.Windows.Media.BitmapCacheBrush';DP='目标';DpOwnerType='System.Windows.Media.BitmapCacheBrush';值='System.Windows.Controls.Image';Value.HashCode='11233554';Value.Type='System.Windows.Controls.Image'BitmapCacheBrush.Target的类型是Visual,所有Visuals都派生自DependencyObject,派生自DispatcherObject。并根据https://msdn.microsoft.com/en-us/library/ms750441(v=vs.100).aspx#System_Threading_DispatcherObject通过从DispatcherObject派生,您可以创建一个具有STA行为的CLR对象,并在创建时按其指定调度程序。因此,所有Visuals都是STA,这意味着您不能冻结BitmapCacheBrush,除非您将其Target设置为null。以上就是C#学习教程:如何冻结不能冻结的freezable对象。侵权请点击右侧联系管理员删除。如需转载请注明出处:
