Windows Forms Usercontrol überschreibt nicht aufgerufen wird
-
02-07-2019 - |
Frage
Ich erstelle ein Windows Forms von Usercontrol abgeleitete Steuerung in einer WPF-Anwendung eingebettet werden. Ich habe im Allgemeinen nach dem angegebenen Verfahren in diesem Link .
public ref class CTiledImgViewControl : public UserControl
{
...
virtual void OnPaint( PaintEventArgs^ e ) override;
...
};
Und in meiner CPP-Datei:
void CTiledImgViewControl::OnPaint( PaintEventArgs^ e )
{
UserControl::OnPaint(e);
// do something interesting...
}
Alles kompiliert und ausgeführt, aber die OnPaint-Methode nie aufgerufen zu werden.
Alle Ideen der Dinge zu suchen? Ich habe viel mit C ++ getan, aber ich bin ziemlich neu für WinForms und WPF, so dass es auch etwas offensichtlich sein könnte ...
Lösung
Die OnPaint
wird normalerweise nicht in einer UserControl
aufgerufen, wenn Sie den entsprechenden Stil festgelegt, wenn es die SetStyle
Verfahren konstruiert ist, verwendet wird. Sie müssen den UserPaint
Stil auf true setzen für den OnPaint
genannt werden.
SetStyle(ControlStyles::UserPaint, true);
Update
Vor kurzem habe ich dieses Thema mich gestoßen und ging auf eine Antwort zu graben. Ich wollte einige Berechnungen während einer Farbe durchzuführen (den einzigartigen Umgang mit Farbe Botschaften nutzen), aber ich war nicht immer einen Anruf bekommen OnPaint
.
Nach dem Graben um mit Reflektor, entdeckte ich, dass OnPaint
nur, wenn das Clipping-Rechteck der entsprechenden WM_PAINT
Nachricht aufgerufen wird, nicht leer ist. Meine UserControl
Instanz hatte ein Kind Steuerelement, das seinen gesamten Client-Bereich gefüllt und daher abgeschnitten alles. Dies bedeutete, dass das Clipping-Rechteck war leer und so kein OnPaint
Anruf.
ich um dieses arbeitete von WndProc
zwingende und einen Handler für WM_PAINT
Zugabe direkt, wie ich nicht einen anderen Weg finden könnte zu erreichen, was ich wollte.
Andere Tipps
Ich löste das Problem, falls es jemanden interessiert. Es war, weil meine WinForms Kontrolle in einem ViewBox eingebettet wurde. Habe ich es zu einem Gitter und begann sofort immer male Veranstaltungen. Ich denke, wenn Fragen über WPF zu fragen, sollten Sie immer die XAML in der Frage enthalten!