如何冻结无法冻结的可冻结对象

2023-11-23

在我的场景中,我想先冻结不变的 BitmapCacheBrush,然后再在后台任务中渲染它。不幸的是,我收到错误“此 Freezable 无法冻结”。 是否有任何解决方法或黑客方法冻结也不可冻结的对象? 也许可以通过反射设置正确的属性来达到这个目标?提前谢谢你们了。

编辑:(根据要求我的示例代码)

 public static class ext
{
    public static async Task<BitmapSource> RenderAsync(this Visual visual)
    {
        var bounds = VisualTreeHelper.GetDescendantBounds(visual);

        var bitmapCacheBrush = new BitmapCacheBrush(visual);
        bitmapCacheBrush.BitmapCache = new BitmapCache();

        // We need to disconnect the visual here to make the freezable freezable :). Of course this will make our rendering blank
        //bitmapCacheBrush.Target = null;

        bitmapCacheBrush.Freeze();

        var bitmapSource = await Task.Run(() =>
        {
            var renderBitmap = new RenderTargetBitmap((int)bounds.Width,
                                                         (int)bounds.Height, 96, 96, PixelFormats.Pbgra32);

            var dVisual = new DrawingVisual();
            using (DrawingContext context = dVisual.RenderOpen())
            {

                context.DrawRectangle(bitmapCacheBrush,
                                      null,
                                      new Rect(new Point(), new Size(bounds.Width, bounds.Height)));
            }

            renderBitmap.Render(dVisual);
            renderBitmap.Freeze();
            return renderBitmap;
        });

        return bitmapSource;
    }

}

首先,您需要弄清楚为什么不能冻结它。进入注册表并将 ManagedTracing 设置为 1(如果一定要设置,则为 REG_DWORD 类型)。我建议您将其添加到注册表中的收藏夹中,以便在需要打开/关闭它时可以快速找到它。

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Tracing\WPF\ManagedTracing

当您尝试冻结 BitmapCacheBrush 或检查 bool 属性 BitmapCacheBrush.CanFreeze 时,您将在 Visual Studio 的“输出”选项卡中收到一条警告,告诉您问题所在。

我根据代码做了一个测试用例https://blogs.msdn.microsoft.com/llobo/2009/11/10/new-wpf-features-cached-composition/

它给我的警告是:

System.Windows.Freezable 警告:2:CanFreeze 返回 false,因为 Freezable 上的 DependencyProperty 的值为 具有线程亲和力的DispatcherObject; Freezable='System.Windows.Media.BitmapCacheBrush'; Freezable.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 类型,所有 Visual 都派生自 DependencyObject,而 DependencyObject 又派生自 DispatcherObject。并根据https://msdn.microsoft.com/en-us/library/ms750441(v=vs.100).aspx#System_Threading_DispatcherObject

通过从 DispatcherObject 派生,您可以创建一个 CLR 对象,该对象具有 STA 行为,并将在创建时获得指向调度程序的指针 时间。

因此,所有 Visuals 都是 STA,这意味着您无法冻结 BitmapCacheBrush,除非您将其 Target 设置为 null。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何冻结无法冻结的可冻结对象 的相关文章

  • 我的 std::hash for std::tuples...有什么改进吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有些人可能已经注意到 std hash 不支持元组 所以我添加了一个重载 它看起来比我到目前为止看到的解决方案 更好 有人有进一步减少这段代码的
  • Visual Studios 2015 中的“恢复 NuGet 包”没有执行任何操作

    我将解决方案从 SVN 拉入 Visual Studios 2015 代码中的一些 使用 引用出现错误 因此我尝试在右键单击 解决方案 中的解决方案时运行 恢复 NuGet 包 选项探索者 这没有任何作用 我必须手动进入 nuget 管理器
  • 如何使用 Entity Framework 和 Identity 解决对象处置异常 ASP.NET Core

    我正在尝试编写一个控制器 该控制器接收来自 AJAX 调用的请求并通过 DBContext 对数据库执行一些调用 但是 当我发出命令时var user await GetCurrentUserAsynch 在对 DBContext 的任何调
  • 在 WCF 上重用我的 PagedList 对象

    问题 我有一个自定义集合PagedList
  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • 如何通过覆盖 MSBuild 目标来防止外语资源生成?

    我正在致力于减少大型 C ASP NET 解决方案的编译时间 我们的解决方案使用通常的 resx 文件方法翻译成大约十几种外语 这些资源文件的解析和编译极大地减慢了我们的编译时间 并且是日常的挫败感 我知道可以创建自定义资源提供程序并摆脱
  • Boost MPI 在监听列表时不会释放资源?

    这是一个后续问题如何释放 boost mpi request https stackoverflow com questions 44078901 how do i free a boostmpirequest 我在监听列表而不是单个项目时
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • 在 .NET Core 中从 HttpResponseMessage 转换为 IActionResult

    我正在将之前在 NET Framework 中编写的一些代码移植到 NET Core 我有这样的事情 HttpResponseMessage result await client SendAync request if result St
  • 如何调试.NET Windows Service OnStart方法?

    我用 NET 编写的代码仅在作为 Windows 服务安装时才会失败 该故障甚至不允许服务启动 我不知道如何进入 OnStart 方法 如何 调试 Windows 服务应用程序 http msdn microsoft com en us l
  • 原子存储抛出错误

    我最近升级到了 C 11 兼容编译器 并且尝试将一些代码从 boost 更新到 c 11 标准 我在使用atomic store转换一些代码时遇到了问题 这是一些简单的测试代码 似乎会引发编译器错误 int main std shared
  • ASP.net WebForms - 在标记中使用 GetRouteUrl

    我一直在尝试弄清楚如何将路由功能与 ASP net 4 0 WebForms 一起使用 我将一条路线添加到我的路线集合中 void Application Start RegisterRoutes RouteTable Routes voi
  • 如何禁用基于 ValidationRule 类的按钮?

    如何禁用基于 ValidationRule 类的 WPF 按钮 下面的代码可以很好地突出显示 TextBox
  • 调试错误:在 vc++ 项目中使用 COM 时发生 所需的运行时?

    我为我的工作创建了一个 COM 组件 我也注册了该组件 在我的系统上 我有两个虚拟机工作站 在我的第一个工作站中 它运行良好 在我的第二个工作站中 它显示一个包含消息的错误框该程序需要一段时间并以不寻常的方式关闭 请联系应用程序管理员 我认
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 如何释放字符串未使用的容量

    我正在程序中处理很多字符串 这些字符串数据在读入我的程序后的整个生命周期内都不会改变 但由于 C 字符串保留了容量 因此浪费了大量肯定不会被使用的空间 我尝试释放这些空间 但没有成功 以下是我尝试过的简单代码 string temp 123
  • 'iter' 的名称查找已更改为新的 ISO 'for' 范围

    我正在尝试编译下面的两个文件 但从编译器收到错误消息 gcc 4 3 3 Linux 错误位于带有以下符号的行 LINE WITH ERROR 我做错了什么 我该怎么改变 路易斯 g c b h b cpp b cpp In functio
  • 为什么 C++ 标准没有将 sizeof(bool) 定义为 1?

    Size of char signed char and unsigned char由 C 标准本身定义为 1 个字节 我想知道为什么它没有定义sizeof bool also C 03 标准 5 3 3 1 说 sizeof char s
  • Android,Volley请求,响应阻塞主线程

    使用 Volley 处理较大响应时会发生一些不好的事情 String url AppHelper DOMAIN service pages profile update json this infoTextView setText getS
  • 创建进程默认浏览器

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 我想获取线程 id 因此 ShellExecute 无法获取线程 id 因此我开始使用

随机推荐

  • 如果表的长度不同,如何对多个表中的列值求和?

    好吧 这应该是一个简单的问题 但我正在寻找一种尽可能快的解决方案 假设我有 3 个表 表的数量会更大 tab1 lt table c 1 1 1 2 2 3 3 3 tab2 lt table c 1 1 4 4 4 tab3 lt tab
  • WPF 位图性能

    我试图了解为什么我的图像不活泼 因此我构建了一个示例来测试 WPF 性能 我使用计时器来计算 显示图像 事件处理程序执行的时间 并使用秒表来测量图像出现在屏幕上所需的时间 底线 显示 100 1600 2500 和 3600 个图像时 WP
  • 循环摩卡测试

    我正在尝试使用摩卡中的数据提供程序来编写更少的代码 var should require should var assert require assert var request require supertest var mongoose
  • 使用 LocationClient 定期获取更新的最节省电池效率的方法是什么?

    我正在考虑设置两个单独的警报 每小时收集用户的位置数据 一个每 59 分钟发出一次以 连接 客户端 另一个警报用于实际获取位置 然后断开客户端连接 就电池寿命而言 如果获取用户位置将成为应用程序的主要消耗 我还应该考虑做什么 或者 是否有不
  • 如何编写异步LINQ查询?

    当我读了一堆LINQ相关的东西后 我突然意识到没有文章介绍如何编写异步LINQ查询 假设我们使用 LINQ to SQL 下面的语句很清楚 但是 如果 SQL 数据库响应缓慢 那么使用该代码块的线程就会受到阻碍 var result fro
  • log4j ConversionPattern 时间戳(微秒)

    我想在使用 log4j 生成的日志文件的每个条目的时间戳中添加微秒 这可能吗 我查过官方文档 但没有提到毫秒以下的单位 现在我有一个如下所示的转换模式 d dd MM yyyy HH mm ss SSS 5p t m n 在日期转换模式中
  • 您建议将哪个数据库与 C# (.NET) 应用程序一起使用?

    我正在制定一个小项目计划 当我需要决定使用什么本地数据库系统时 输入数据将存储在网络服务器上 托管 MySQL DB 这个想法是建立一个流程来下载所有必要的数据 例如在午夜 并处理它们 然而 会有很多输入和处理阶段 所以我需要使用某种本地数
  • 处理器有哪些优化代码的技巧?

    我正在寻找诸如代码重新排序之类的东西 这些东西甚至可能在多处理器的情况下破坏代码 最重要的一个是内存访问重新排序 如果没有内存栅栏或序列化指令 处理器可以自由地重新排序内存访问 某些处理器架构对其可以重新排序的数量有限制 Alpha 因最弱
  • 如何使用 lambda 初始化映射?

    我想在单个语句中声明一个完全填充的映射字段 可能包含多个嵌套语句 如下所示 private static final Map
  • Ruby 字符串连接问题

    这有效 irb main 001 0 gt name Rohit Sharma gt Rohit Sharma 但这并不 irb main 001 0 gt fname Rohit gt Rohit irb main 002 0 gt ln
  • 根据眼睛图像进行注视估计

    到目前为止我已经能够准确地检测瞳孔和眼角 您可以在此处看到我在回答自己的问题时上传的一些快照 执行稳定的眼角检测 这是我到目前为止所做的 我通过查看 TLCP TRCP 和 BLCP 来校准用户的视线 在哪里 CP calibration
  • 将大数据加载到 TensorFlow 2.0 中,而不将其加载到 RAM 上

    我已经处理并保存了大量视频和音频文件数据集 大约 8 到 9 GB 的数据 数据保存为 2 个 numpy 数组 每个数组对应一种模态 文件的形状为 number of examples maximum time length featur
  • 带有 ViewPager2 的 BottomSheetBehavior 无法通过嵌套的 RecyclerView 滚动向下滚动

    我有一个类似的观点BottomSheet行为这个视图有ViewPager2里面 每个ViewPager2的页面都是一个垂直的RecyclerView 问题是 当当前垂直 RecyclerView ViewPager 的页面 无法再垂直滚动时
  • 在 swift4.1 中将 Any 转换为 Float 总是失败

    在以前的版本中 要从 a 获取浮点值 String Any 字典 我可以用let float dict somekey as Float 但是在swift4 1中 不起作用 似乎是这样的类型dict somekey 已被隐含地推断为Doub
  • 如何从 SqlDataReader 解析 Nullable

    DateTime TryParse 方法采用 DateTime 作为参数 而不是 DateTime 现在我有以下代码 if DateTime TryParse reader Placed ToString out placed throw
  • 在 Windows Kafka 上删除主题时出现 AccessDeniedException

    我刚刚在我的 Windows 机器上安装了 Kafka 来自 Confluence Platform 我启动了 Zookeeper 和 Kafka 并创建主题 生产和消费它们的工作 然而 一旦我删除一个主题 Kafka 就会崩溃 如下所示
  • 如何避免 Selenium 中的 StaleElementReferenceException - Python

    我陷入了编写 Python Selenium 脚本的困境 似乎无法令人满意地解决我收到的这个 StaleElementReferenceException 我已加载页面并单击一个按钮 该按钮将打开一个表单 允许用户向订单添加新的信用卡 此时
  • 如何用java转换巨大的xml文件?

    正如标题所说 我有一个巨大的 xml 文件 GB
  • Angularjs 后接收钩子或类似的?

    有没有一种方法可以在每次从服务器返回响应后调用一个函数 而无需在回调中显式调用它 主要目的是我确实有一个通用错误处理程序服务 我在每个请求的回调中调用它 并且我想在某处指定它并且它应该被自动调用 我给了Gloopy一个 1的解决方案 但是
  • 如何冻结无法冻结的可冻结对象

    在我的场景中 我想先冻结不变的 BitmapCacheBrush 然后再在后台任务中渲染它 不幸的是 我收到错误 此 Freezable 无法冻结 是否有任何解决方法或黑客方法冻结也不可冻结的对象 也许可以通过反射设置正确的属性来达到这个目