OnRender方法不适用于超过144个控件

时间:2011-09-30 12:50:26

标签: c# wpf

我有一个自定义TextBox,它覆盖了OnRender方法。不幸的是,当我向网格添加超过143-145个TextBox时,OnRender无法正常工作。

这是一个带有160个TextBox的窗口在wpf设计器中的样子。每个TextBox在OnRender方法中将边框画笔设置为红色。对于文本框的最后一列,OnRender不再起作用。

render test example http://s3.postimage.org/id6jvq09n/render_Test_Example.png

问题不是绑定到wpf设计器,在运行时也是如此。有趣的是,如果您删除设计器中的一个组件,或者在渲染后在运行时删除它,那么所有其他控件都会突然发挥作用。

示例代码:

MytextBox.cs
RenderTestPanel.xaml
RenderTestPanel.xaml.cs

2 个答案:

答案 0 :(得分:0)

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

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

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

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

当您扩展控件的功能和/或目的时,您应该只“导出并覆盖”,并且您的示例中没有任何内容表明您正在执行的操作。

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

答案 1 :(得分:0)

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