UserControl di Windows Form sostituisce non essere chiamato
-
02-07-2019 - |
Domanda
Sto creando un controllo Windows Form derivato da UserControl da incorporare in un'app WPF. In genere ho seguito le procedure riportate in questo link .
public ref class CTiledImgViewControl : public UserControl
{
...
virtual void OnPaint( PaintEventArgs^ e ) override;
...
};
E nel mio file CPP:
void CTiledImgViewControl::OnPaint( PaintEventArgs^ e )
{
UserControl::OnPaint(e);
// do something interesting...
}
Tutto viene compilato ed eseguito, tuttavia il metodo OnPaint non viene mai chiamato.
Qualche idea sulle cose da cercare? Ho fatto molto con C ++, ma sono abbastanza nuovo per WinForms e WPF, quindi potrebbe essere qualcosa di ovvio ...
Soluzione
Il OnPaint
normalmente non viene chiamato in un UserControl
a meno che tu non imposti lo stile appropriato quando viene costruito usando il metodo SetStyle
. Devi essere impostato su UserPaint
su true affinché OnPaint
venga chiamato.
SetStyle(ControlStyles::UserPaint, true);
Aggiornamento
Di recente ho riscontrato questo problema da solo e sono andato alla ricerca di una risposta. Volevo eseguire alcuni calcoli durante un disegno (per sfruttare la gestione unica dei messaggi di disegno) ma non sempre ricevevo una chiamata a OnPaint
.
Dopo aver cercato con Reflector, ho scoperto che OnPaint
viene chiamato solo se il rettangolo di ritaglio del corrispondente messaggio WM_PAINT
non è vuoto. La mia istanza UserControl
aveva un controllo figlio che riempiva la sua intera area client e quindi tagliava tutto. Ciò significava che il rettangolo di ritaglio era vuoto e quindi nessuna chiamata OnPaint
.
Ho risolto il problema sovrascrivendo WndProc
e aggiungendo un gestore per WM_PAINT
in quanto non riuscivo a trovare un altro modo per ottenere ciò che volevo.
Altri suggerimenti
Ho risolto il problema, nel caso qualcuno fosse interessato. È stato perché il mio controllo WinForms era incorporato in un ViewBox. L'ho cambiato in una griglia e ho subito iniziato a ricevere eventi di disegno. Immagino che quando fai domande su WPF, dovresti sempre includere XAML nella domanda!