【发布时间】:2016-11-15 17:04:31
【问题描述】:
我有一个自定义 TextBox,它覆盖了 OnRender 方法。不幸的是,当我向网格中添加超过 143-145 个文本框时,OnRender 无法正常工作。
这就是 wpf 设计器中带有 160 个文本框的窗口的样子。每个 TextBox 在 OnRender 方法中将边框画笔设置为红色。对于文本框的最后一列,OnRender 不再起作用。
render test example http://s3.postimage.org/id6jvq09n/render_Test_Example.png
问题与 wpf 设计器无关,在运行时也会发生同样的情况。有趣的是,如果您在设计器内部或在运行时删除一个组件,一旦它被渲染,那么所有其他控件都会突然工作。
示例代码:
【问题讨论】:
-
你真的需要显示那么多文本框吗?尝试使用 TextBlocks,并仅在用户选择“编辑”单元格时显示 TextBox。 TextBlock 的重量要轻得多。
-
除了Chibacity的评论,你为什么不直接用一个Style把
BorderBrush设置为Red呢?或者甚至在构造函数中将画笔设置为红色,它会被设置一次,而不是OnRender会被多次调用? -
@chibacity 是的,我们确实必须显示那么多文本框。我们正在将地图从旧系统转换为 c# 面板,其中一些旧地图包含网格,例如 10x15 可修改文本字段。它们就像由文本字段组成的表格。
-
@Markus 您可以将它们显示为文本块,并且仅在用户单击单元格时显示文本框。用户一次只能编辑一个单元格,因此理论上它们不需要同时都是 TextBox。
-
@Rachel OnRender 中设置的属性要多得多。 BorderBrush 设置在 OnRender 中,因为它是完成我们的边框行为的最方便的方法。例如,在 wpf 设计器中,用户可以将显示模式从“DESIGN”更改为“RUNTIME”。在设计模式下,文本字段将其边框呈现为红色或绿色,具体取决于其类型。在运行时模式下,只读文本字段以无边框呈现,可修改文本字段以边框呈现。我们还在 OnRender 中绘制下划线,因为 TextDocoration 不能按我们需要的方式工作。等等..