我有一个自定义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来实现目标。