Domanda

Sto utilizzando la ToolStripDropDown di presentarsi un selectionpopup.

Il ToolStripDropDown contiene alcuni controlli personalizzati con thread in esecuzione. Le discussioni si conclude con la manifestazione OnHandleDestroyed, ma per qualche motivo il ToolStripDropDown non smaltire / distruggerla del manico dopo la chiusura.

mi Smaltimento l'ToolStripDropDown sul chiuso evento dà un'eccezione perché tutto ciò accede ancora il ToolStripDropDown.

Come faccio a sapere se il controllo personalizzato è ancora in uso o meno di porre fine alla discussione?

Custom-Control:

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);
        }
    }
}

EDIT:

Dopo stesso più testando non ero in grado di smaltire il ToolStripDropDown. Per risolvere il problema sto solo distruggendo la maniglia su una stretta del ToolStripDropDown.

        protected override void OnClosed(ToolStripDropDownClosedEventArgs e)
        {
            base.OnClosed(e);
            this.DestroyHandle();
        }
È stato utile?

Soluzione

toolstrips avere un bug molto persistente (sosteneva di essere fissato, ma ho ancora problemi), dove si registrano un gestore di eventi per SystemEvents.UserPreferenceChanged essere in grado di ridisegnare se l'utente modifica le impostazioni di stile globali nel sistema operativo.

L'unica soluzione che ho trovato è quello di eliminare i toolstrips allegate elencando gestori nel SystemEvents.UserPreferenceChanged e rimuovendole sulla disposizione del controllo.

ToolStrip perdita di memoria

http: // connettersi. microsoft.com/VisualStudio/feedback/details/115600/toolstrip-leaks-after-calling-dispose#

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top