Метод OnRender не работает с более чем 144 элементами управления - PullRequest
2 голосов
/ 30 сентября 2011

У меня есть пользовательский TextBox, который переопределяет метод OnRender.К сожалению, OnRender не работает должным образом, когда я добавляю в сетку более 143-145 текстовых ящиков.

Так выглядит окно с 160 текстовыми ящиками в конструкторе wpf.Каждый TextBox устанавливает красный цвет кисти в методе OnRender.Для последнего столбца текстовых полей OnRender больше не работает.

пример теста визуализации http://s3.postimage.org/id6jvq09n/render_Test_Example.png

Проблема не связана с конструктором wpf, то же самое происходит во время выполнения.Как ни странно, если вы удалите один компонент внутри конструктора или во время выполнения после его рендеринга, то все остальные элементы управления неожиданно сработают.

пример кода:

MytextBox.cs
RenderTestPanel.xaml
RenderTestPanel.xaml.cs

Ответы [ 2 ]

0 голосов
/ 15 ноября 2016

Мне удалось обойти проблему, очень похожую на эту.Я разместил резолюцию здесь: https://stackoverflow.com/a/40605635/5823234

0 голосов
/ 30 сентября 2011

Ваш подход должен быть предложен chibacity. Этот тип поведения является стандартным и даже используется DataGridTextColumn, который поставляется с WPF. Из 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...