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

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

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

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

示例代码:

MytextBox.cs
RenderTestPanel.xaml
RenderTestPanel.xaml.cs

最佳答案

您的方法应该是建议的一种方法。这种行为是标准的行为,甚至由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来实现目标。

08-08 03:57