C #: ToolStripDropDown не удаляет / уничтожает Handle - PullRequest
0 голосов
/ 26 июля 2011

Я использую ToolStripDropDown для отображения всплывающего окна выбора.

ToolStripDropDown содержит несколько пользовательских элементов управления с запущенными потоками.Threads заканчивается событием OnHandleDestroyed, но по какой-то причине ToolStripDropDown не удаляет / не уничтожает свой дескриптор после закрытия.

Удаление ToolStripDropDown на закрытом событии дает мне исключение, потому что все ещеобращается к ToolStripDropDown.

Как узнать, используется ли пользовательский элемент управления или нет для завершения потока?

Пользовательский элемент управления:

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-Управление:

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

РЕДАКТИРОВАТЬ:

После такого же дополнительного тестирования я не смог избавиться от раскрывающегося списка инструментов.В качестве обходного пути я просто разрушаю ручку при закрытии панели инструментов.

        protected override void OnClosed(ToolStripDropDownClosedEventArgs e)
        {
            base.OnClosed(e);
            this.DestroyHandle();
        }

1 Ответ

2 голосов
/ 27 июля 2011

ToolStrips имеют очень постоянную ошибку (утверждается, что она исправлена, но у меня все еще есть проблемы), когда они регистрируют обработчик событий в SystemEvents.UserPreferenceChanged, чтобы иметь возможность перерисовывать, если пользователь изменяет глобальные настройки стиля в ОС.

Единственный найденный мной обходной путь - удалить прикрепленные наборы инструментов, перечислив обработчики в SystemEvents.UserPreferenceChanged и удалив их при удалении элемента управления.

Утечка памяти в ToolStrip

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...