Ho una forma (MainPage
) e ho fissato un UserControl
in esso alcune volte, quindi scrivere un metodo in quella forma in questo modo per invocare:Invoke di un UserControl non funziona
delegate void containerPanelCallback(UIPart uiPart);
public void IncludeUIPart(UIPart uiPart)
{
if (this.containerPanel.InvokeRequired)
{
containerPanelCallback d = new containerPanelCallback(IncludeUIPart);
containerPanel.Invoke(d, new object[] { uiPart });
}
else
{
containerPanel.Controls.Clear();
containerPanel.Controls.Add(uiPart);
}
uiPart.Size = this.containerPanel.Size;
uiPart.Dock = DockStyle.Fill;
}
UIPart
classe ereditare da UserControl
che i miei UserControls ereditano da UIPart
.
Questo metodo e invocare lanciato in questo modo:
public class myClass
{
...
private static MainPage _frmMain;
private static myUIPart6 UIP6;
...
public static void aMethod(/* Some arguments */)
{
UIP6 = new myUIPart6 { /* Some settings of properties */ };
_frmMain.IncludeUIPart(UIP6);
_frmMain.Show(); /*Throws an error*/
}
...
}
L'errore è:
operazione cross-thread non valida: controllo 'MainPage' accede da un thread diverso dal thread è stato creato.
ho trovato molte domande e molte risposte qui su questo errore, ma non riesco a capire il motivo per cui sta gettando a _frmMain.Show();
?, Devo richiamare qualcosa d'altro? O sono in un modo sbagliato? È legato alla creazione di Handle del mio UserControl?
Come fare chiami 'aMethod'? –
Invoke() deve essere chiamato per qualsiasi/tutte le operazioni con l'interfaccia utente eseguite da un thread non principale. Nell'esempio, si utilizza Invoke on quando si chiama IncludeUIPart(), ma no Invoke() quando si chiama _frmMain.Show. Prova a racchiudere l'intero aMethod in Invoke() e rimuovere Invoke call da IncludeUIPart() –
Penso che tu sia nei primi anni 2000-es come sviluppatore e anche nella tua battuta;) –