【问题标题】:WPF Performance Problems with derived TextBox controls派生的 TextBox 控件的 WPF 性能问题
【发布时间】:2025-12-16 22:50:02
【问题描述】:

我有一个 WPF 应用程序,它根据保存在数据库中的表单配置呈现输入表单。

表单有许多控件(100 多个),并且这些控件中的大多数都派生自 TextBox 控件。在某些机器上(fast Hardware,Win7 32Bit,还有一些老的,Windows XP 32Bit),在将数据输入到很多这些表格后,输入性能下降。每次击键都会延迟几毫秒,解决此问题的唯一解决方案是关闭应用程序并重新启动它。

我的派生控件覆盖DefaultStyleKeyProperty 的元数据以设置自定义模板。

我目前正在 SciTech 内存分析器中重新搜索应用程序,但也许有人已经遇到过派生文本框的类似问题,可以给我一个提示,让我多花几个小时/天来调查这个问题吗?

更新
也看here

【问题讨论】:

    标签: wpf wpf-controls profiling


    【解决方案1】:

    听起来你可能有什么东西阻止了正在被 GCed 的“已用表单”上的控件。

    首先打开并使用尽可能多的表单,查看 Windows 任务管理器,看看你的内存使用量是否在上升——如果不是,那么寻找内存韭菜是没有意义的

    检查您是否正在删除表单/控件放置在任何长期存在的对象上的所有事件处理程序。

    检查您数据绑定的任何对象以实现 INotifyPropertyChanged,请参阅KB938416

    我过去使用Red Gate memory profiler 取得了不错的效果。

    【讨论】:

    • +1 实际上,我发现了一个内存错误,就像您在第四段中描述的那样。我正在进一步调查,也不清楚内存错误是否与延迟问题有直接关系,我们会看到......问题描述可以在这里找到:support.microsoft.com/kb/938416/en-us,也许我会发布相关答案。
    【解决方案2】:

    您无需创建用户看不到的控件,100 多个控件将产生成本。

    你可以在虚拟模式下使用一些列表控件,这样你的 TextBox 控件只会在可见时创建。

    【讨论】:

    • 感谢您的回答。不,这些表格是具有复杂格式的纸质表格的代表。我认为没有任何可能进行 UI 虚拟化或任何类型的惰性控件创建。然而,问题不在于控制的数量。打开并使用了大约 50 个这样的表格后,问题就出现了。