我有一个自定义的 TextBox,它覆盖了 OnRender
方法。不幸的是,当我向网格添加超过 143-145 个文本框时,OnRender
无法正常工作。
这是带有 160 个文本框的窗口在 wpf 设计器中的样子。每个 TextBox 在 OnRender
方法中将边框刷设置为红色。对于文本框的最后一列,OnRender
不再起作用。
render test example http://s3.postimage.org/id6jvq09n/render_Test_Example.png
问题不限于 wpf 设计器,在运行时也会发生同样的情况。有趣的是,如果您在设计器中删除一个组件或在渲染后在运行时删除它,那么所有其他控件都会突然起作用。
示例代码:
最佳答案
您的方法应该是 chibacity 建议的方法。这种类型的行为是标准的,甚至被 DataGridTextColumn
使用随 WPF 一起提供。来自 MSDN:
DataGridTextColumn 在非编辑模式下创建一个 TextBlock 元素,在编辑模式下创建一个 TextBox 元素。
此外,正如许多其他用户在评论中所建议的那样,您不应重写 OnRender
来调整控件的视觉外观。在 WPF 中,可以通过调整控件的 Style
和/或 Template
来更改控件的视觉外观。以下样式会导致与您的 OnRender
覆盖完全相同的外观变化:
<Style TargetType="TextBox">
<Setter Property="BorderBrush" Value="Red" />
</Style>
只有在扩展控件的功能和/或目的时才应该“派生和覆盖”,并且您的示例中没有任何内容表明您正在做的事情。
此外,您的 RenderTestPanel.xaml意味着您所做的只是创建一个由 WPF 提供的数据网格。我强烈建议使用开箱即用的 DataGrid
,为 DataGridTextColumn
设置样式,您将(可能)用更少的代码完全在 XAML 中完成您的目标。
关于c# - OnRender 方法不适用于超过 144 个控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7610608/