【问题标题】:OnRender Method does not work with more than 144 controlsOnRender 方法不适用于超过 144 个控件
【发布时间】: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 设计器无关,在运行时也会发生同样的情况。有趣的是,如果您在设计器内部或在运行时删除一个组件,一旦它被渲染,那么所有其他控件都会突然工作。

示例代码:

MytextBox.cs
RenderTestPanel.xaml
RenderTestPanel.xaml.cs

【问题讨论】:

  • 你真的需要显示那么多文本框吗?尝试使用 TextBlocks,并仅在用户选择“编辑”单元格时显示 TextBox。 TextBlock 的重量要轻得多。
  • 除了Chibacity的评论,你为什么不直接用一个Style把BorderBrush设置为Red呢?或者甚至在构造函数中将画笔设置为红色,它会被设置一次,而不是OnRender 会被多次调用?
  • @chibacity 是的,我们确实必须显示那么多文本框。我们正在将地图从旧系统转换为 c# 面板,其中一些旧地图包含网格,例如 10x15 可修改文本字段。它们就像由文本字段组成的表格。
  • @Markus 您可以将它们显示为文本块,并且仅在用户单击单元格时显示文本框。用户一次只能编辑一个单元格,因此理论上它们不需要同时都是 TextBox。
  • @Rachel OnRender 中设置的属性要多得多。 BorderBrush 设置在 OnRender 中,因为它是完成我们的边框行为的最方便的方法。例如,在 wpf 设计器中,用户可以将显示模式从“DESIGN”更改为“RUNTIME”。在设计模式下,文本字段将其边框呈现为红色或绿色,具体取决于其类型。在运行时模式下,只读文本字段以无边框呈现,可修改文本字段以边框呈现。我们还在 OnRender 中绘制下划线,因为 TextDocoration 不能按我们需要的方式工作。等等..

标签: c# wpf


【解决方案1】:

您的方法应该是 chibacity 建议的方法。这种行为是标准的,甚至被 WPF 附带的DataGridTextColumn 使用。来自 MSDN:

DataGridTextColumn creates a TextBlock element in the non-editing mode and a TextBox element in the editing mode.

此外,正如 cmets 中许多其他用户所建议的,您不应覆盖 OnRender 来调整控件的视觉外观。在 WPF 中,可以通过调整控件的Style 和/或Template 来更改控件的视觉外观。以下样式会导致与您的 OnRender 覆盖完全相同的外观更改:

<Style TargetType="TextBox">
  <Setter Property="BorderBrush" Value="Red" />
</Style>

当您扩展控件的功能和/或目的时,您应该只“派生和覆盖”,并且您的示例中没有任何内容表明您正在做的事情。

此外,您的RenderTestPanel.xaml 暗示您所做的只是创建一个由 WPF 提供的数据网格。我强烈建议您使用开箱即用的DataGrid,设置DataGridTextColumn 的样式,您将(可能)用更少的代码完成您的目标,并且完全使用XAML。

【讨论】:

  • 我无法使用 DataGrid。我正在将现有的控制台应用程序转换为 c#。这些应用程序没有数据网格/表格,因此开发人员使用文本字段数组来创建表格。我必须使用文本框/文本字段。正如上面的 cmets 中所解释的,我在 OnRender 内设置了边框颜色,因为边框并不总是红色。在 wpf 设计器中,用户可以在设计模式和运行时模式之间切换。在设计模式下,只读字段带有红色边框,可修改字段带有绿色边框。
  • 在运行时模式下,只读字段没有边框,可修改字段有轻微可见的边框。如果没有 OnRender,这可能是可能的,但不仅仅是边框。如何在没有 OnRender 的情况下绘制填充整个文本字段的下划线?这可以用样式来完成吗?而且我还有其他在设计和运行时视图中看起来不同的属性。如何用样式做到这一点? Rachel 建议使用触发器,但这是我回去工作后必须查找的内容。
【解决方案2】:

我能够解决与此非常相似的问题。 我在这里发布了决议: https://stackoverflow.com/a/40605635/5823234

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    相关资源
    最近更新 更多