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

标签 c# wpf

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

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

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

问题不限于 wpf 设计器,在运行时也会发生同样的情况。有趣的是,如果您在设计器中删除一个组件或在渲染后在运行时删除它,那么所有其他控件都会突然起作用。

示例代码:

MytextBox.cs
RenderTestPanel.xaml
RenderTestPanel.xaml.cs

最佳答案

您的方法应该是 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/

相关文章:

c# - Metro 获取 StorageFile 的 base64 字符串

wpf - 在 ListView 上用鼠标激活水平滚动

c# - 使用用户控件时的 WPF 数据绑定(bind)

c# - C#以异步方式接受套接字-最佳做法

c# - 从 C# 运行 dos 命令行?

c# - 命名局部常量 : UpperCamelCase or lowerCamelCase?

c# - 从索引器返回 IEnumerable,不好的做法?

wpf - 当高度为自动时,如何让滚动条与 ListView 一起出现?

.NET 在调度程序处理挂起时无法执行此操作

c# - 学习 WPF 和 MVVM