【发布时间】:2015-07-07 12:58:13
【问题描述】:
我自己做了一个控件来“伪造”一个细节网格。每一行都是一个单独的控件,这意味着我需要很多。我正在尝试将它们存储在位于 ScrollViewer 中的 StackPanel 中。
当我添加一个控件时,我的可执行文件的内存使用量上升了 10mb。当我尝试使用绘制所有 110 个数据包时,它会攀升至 1.5GB 并引发 OutOfMemory 异常。
控件非常简约。没有执行,只有几个标签、一些矢量图形、一个扩展器和一组 3 个控件(只有多个标签)。
我该如何解决这个问题?
【问题讨论】:
-
为什么你首先要“伪造”一个网格?
-
您可以发布控件吗?我做了类似的事情(尽管控制更简约),没有任何问题显示 + 数千个
-
我建议在您的自定义控件中实现虚拟化,以确保它只呈现可见项目(它会在您滚动并替换它们后面的 DataContext 时重新使用控件),并考虑使用基本的除当前具有用户焦点的项目之外的所有项目的单元格模板。我曾经为减少 Grid 中的内存使用所做的一个基本示例是将每个项目显示为基本 TextBlock,并且仅在用户将焦点设置在单元格上时将其替换为 TextBox。
-
寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误和在问题本身中重现它所需的最短代码。没有明确的问题陈述的问题对其他读者没有用处。见:How to create a Minimal, Complete, and Verifiable example.
-
@Rachel:虚拟化不是我最喜欢的解决方案,但我会尝试一下。
标签: c# wpf memory user-controls out-of-memory