Пользовательский контроль WPF вызывает исключение нехватки памяти - PullRequest
0 голосов
/ 09 марта 2010

В поисках бесплатного решения для проверки орфографии, я думал, что был настолько умен, но думаю, что нет.

Я создал приложение на основе форм Windows и хочу, чтобы форма добавляла указанное пользователем количество пользовательских элементов управления (с текстовыми полями) на панель. Затем пользователь может нажать на некоторую кнопку, и элементы управления на этой панели будут очищены и добавлены новые. Пользователь что-то делает, и процесс повторяется. Теперь я хотел, чтобы эти текстовые поля поддерживали проверку орфографии, и искал бесплатное решение.

Текстовые поля WPF поддерживают проверку орфографии, тогда как в обычных формах выигрыша это не так. Я думал, что смогу использовать эти текстовые поля WPF, добавив их в объект ElementHost, который, в свою очередь, находится на панели. Эта панель будет пользовательским элементом управления.

Итак, в моем приложении я смогу добавить экземпляры этих пользовательских элементов управления в форму и использовать проверку правописания в .NET. Это на самом деле сработало, но после некоторого использования приложения обнаружилось, что приложение в конечном итоге зависнет из-за ошибок нехватки памяти. Я определил ошибки памяти для этих элементов управления WPF, поскольку эта проблема не возникает с обычными текстовыми полями.

Когда окно открывается и указывается количество элементов управления, это почти то же самое, как добавляются элементы управления:

Dim xOffset As Integer = 0
For i As Integer = 0 To theNumber
    Dim myUserControl As New SpecialUserControl()
    myPanel.Controls.Add(myUserControl)
    myUserControl.Location = New Point(7, 7)
    myUserControl.Location = New Point(xOffset, 7)
    xOffset = xOffset + 207
Next

Обратите внимание, что:

  • myPanel - это панель на форме
  • SpecialUserControl - это пользовательский элемент управления с текстовым полем WPF (внутри объекта ElementHost)

Когда пользователь нажимает кнопку, панель очищается:

myUserControl.Controls.Clear()

Пользователь может затем повторить процесс.

В Интернете было много результатов, когда я пытался найти решение, и я думаю, что проблема, с которой я столкнулся, связана с тем, что элемент управления WPF не исчезает даже после очистки панели. Следуя этому заключению, я попробовал разные решения, касающиеся утилизации этих элементов управления или установки их на ничего, кроме проблемы с памятью. Если бы кто-то мог дать мне несколько советов или идей здесь, я был бы очень признателен.

1 Ответ

0 голосов
/ 19 марта 2010

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

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