Пользовательский контроль Windows Forms переопределяет, что он не вызывается
-
02-07-2019 - |
Вопрос
Я создаю элемент управления Windows Forms, производный от UserControl, для встраивания в приложение WPF.В целом я следовал процедурам, приведенным в эта ссылка.
public ref class CTiledImgViewControl : public UserControl
{
...
virtual void OnPaint( PaintEventArgs^ e ) override;
...
};
И в моем CPP-файле:
void CTiledImgViewControl::OnPaint( PaintEventArgs^ e )
{
UserControl::OnPaint(e);
// do something interesting...
}
Все компилируется и запускается, однако метод OnPaint никогда не вызывается.
Есть какие-нибудь идеи, на что обратить внимание?Я много работал с C ++, но я довольно новичок в WinForms и WPF, так что это вполне может быть чем-то очевидным...
Решение
Тот Самый OnPaint
обычно его не вызывают в UserControl
если только вы не зададите соответствующий стиль при его создании с использованием SetStyle
способ.Вам нужно установить UserPaint
стиль, соответствующий действительности для OnPaint
чтобы мне позвонили.
SetStyle(ControlStyles::UserPaint, true);
Обновить
Недавно я сам столкнулся с этой проблемой и принялся искать ответ.Я хотел выполнить некоторые вычисления во время рисования (чтобы использовать уникальную обработку сообщений paint), но я не всегда получал вызов OnPaint
.
Покопавшись с Reflector, я обнаружил, что OnPaint
вызывается только в том случае, если отсекающий прямоугольник соответствующего WM_PAINT
сообщение не является пустым.Мой UserControl
у экземпляра был дочерний элемент управления, который заполнял весь его клиентский регион и, следовательно, обрезал все это.Это означало, что отсекающий прямоугольник был пуст, и поэтому нет OnPaint
позвони.
Я обошел это, переопределив WndProc
и добавление обработчика для WM_PAINT
непосредственно потому, что я не мог найти другого способа достичь того, чего я хотел.
Другие советы
Я решил эту проблему, на случай, если кому-то будет интересно.Это было потому, что мой элемент управления WinForms был встроен в viewBox.Я изменил его на сетку и сразу же начал получать события рисования.Я думаю, задавая вопросы о WPF, вы всегда должны включать XAML в вопрос!