C#: ToolStripdropdown no elimina/DestruyeHandle
-
26-10-2019 - |
Pregunta
Estoy usando el ToolStripDropDown
Para mostrar una SelectionPopup.
los ToolStripDropDown
Contiene algunos controles personalizados con hilos en ejecución. Los hilos terminan con el evento OnHandledEnstoyed, pero por alguna razón el ToolStripDropDown
No elimina/destruye su mango después del cierre.
Eliminando el ToolStripDropDown
En el evento cerrado me da una excepción porque cualquier cosa aún accede a ToolStripdropdown.
¿Cómo sé si el control personalizado todavía está en uso o no para finalizar el hilo?
Control personalizado:
public class CControl : Control
{
Thread StyleThread;
Object lockOBJ = new Object();
bool abortthread = false;
public CControl()
{
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.Selectable, false);
StyleThread = new Thread(new ThreadStart(this.StyleDelegate));
}
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
if(!StyleThread.IsAlive)
StyleThread.Start();
}
protected override void OnHandleDestroyed(EventArgs e)
{
base.OnHandleDestroyed(e);
lock (lockOBJ)
{
abortthread = true;
}
if (StyleThread.IsAlive)
{
StyleThread.Join(100);
}
}
...
}
ToolStripdropDown-Control:
public class AddPopUp : UserControl
{
/*
------------------------------------
This Control contains some CControls
------------------------------------
*/
public void Show(Control control)
{
TSDD tsdd = new TSDD(this);
Point screenpoint = control.PointToScreen(new Point(0, 0));
tsdd.Show(control,new Point(0, -tsdd.Height ));
}
class TSDD : ToolStripDropDown
{
private Control Control { get; set; }
public TSDD(Control control)
{
this.Control = control;
this.DropShadowEnabled = false;
ToolStripControlHost ch = new ToolStripControlHost(control);
this.Items.Add(ch);
}
protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
{
base.SetBoundsCore(x, y, Control.Size.Width + 16, Control.Size.Height + 18, specified);
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
unchecked
{
cp.Style |= (int)0x80000000;
cp.Style |= 0x40000;
}
return cp;
}
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x84)
{
m.Result = (IntPtr)1;
return;
}
base.WndProc(ref m);
}
}
}
EDITAR:
Después de las mismas pruebas, no pude deshacerse de ToolStripdropdown. Como solución alternativa, solo estoy destruyendo el mango en el cierre de ToolStripdropdown.
protected override void OnClosed(ToolStripDropDownClosedEventArgs e)
{
base.OnClosed(e);
this.DestroyHandle();
}
Solución
ToolStrips tiene un error muy persistente (afirmado que se soluciona, pero todavía tengo problemas) en los que registran un controlador de eventos a SystemEvents. UserPreferenceChanged para poder volver a pintar si el usuario cambia la configuración de estilo global en el sistema operativo.
La única solución que he encontrado es eliminar las tierras de herramientas adjuntas enumerando los manejadores en los sistemas.