首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#:ToolStripDropDown不处置/DestroyHandle

C#:ToolStripDropDown不处置/DestroyHandle
EN

Stack Overflow用户
提问于 2011-07-26 15:57:24
回答 1查看 887关注 0票数 0

我正在使用ToolStripDropDown显示一个选择弹出窗口。

ToolStripDropDown包含一些带有运行线程的自定义控件。线程以OnHandleDestroyed事件结束,但是由于某些原因,ToolStripDropDown在关闭后不会处理/销毁它的句柄。

在closed-event上处理ToolStripDropDown会给我一个异常,因为仍然有任何东西访问ToolStripDropDown。

如何知道自定义控件是否仍在使用或不结束线程?

自定义控件:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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);
        }
    }
}

编辑:

经过同样多的测试后,我无法处理toolstripdropdown。作为一种变通方法,我只是在关闭toolstripdropdown时销毁句柄。

代码语言:javascript
复制
        protected override void OnClosed(ToolStripDropDownClosedEventArgs e)
        {
            base.OnClosed(e);
            this.DestroyHandle();
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-27 16:16:58

ToolStrips有一个非常持久的错误(声称已经修复,但我仍然有问题),他们向SystemEvents.UserPreferenceChanged注册了一个事件处理程序,以便能够在用户更改操作系统中的全局样式设置时重新绘制。

我发现的唯一解决办法是通过枚举SystemEvents.UserPreferenceChanged中的处理程序并在处理控件时删除它们来删除附加的工具条。

ToolStrip memory leak

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6826958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档