自定义控制和处置

Posted

技术标签:

【中文标题】自定义控制和处置【英文标题】:Custom control and dispose 【发布时间】:2013-11-19 14:09:50 【问题描述】:

故事的开始是here。

我有一个组件,我希望它清理计时器(托管资源,对吗?):

public class MyPictureBox : PictureBox, IDisposable

    private Timer _timer1 = new Timer();
    private Timer _timer2 = new Timer();
    public MyPictureBox(): base()
    
        _timer1.Interval = 100;
        _timer1.Start();
        _timer2.Interval = 250;
        _timer2.Start();
    

    // ... all sort of code


    new void Dispose()
    
        base.Dispose();
        _timer1.Dispose();
        _timer2.Dispose();
    

    void IDisposable.Dispose()
    
        _timer1.Dispose();
        _timer2.Dispose();
    

如您所见,我尝试再实现一个(oO)IdDisposable(尽管 PictureBox->Control->Component->IDisposable)。但是..它们都没有被调用。

使用设计器将控件置于表单上。但它没有出现在表单Components 中,这应该是在处理表单时不调用它的原因:

Form1 form = new Form1();
form.Dispose(); // MyPictureBox.Dispose() are not called

我的问题是我应该如何组织处置我的控制计时器以获得我需要的东西 - 处置 MyPictureBox 计时器和表单处置?

【问题讨论】:

【参考方案1】:

您必须覆盖Dispose(bool disposing)。并且不需要显式实现IDisposable

protected override void Dispose(bool disposing)

    _timer1.Dispose();
    _timer2.Dispose();
    base.Dispose(disposing);

【讨论】:

像奇迹一样工作。快速而清晰的答案。谢谢! 提示:如果您正在使用像 UserControls 这样的东西,那么 *.designer.cs 文件中已经存在“protected override void Dispose(bool disposing)”方法。随意将其移至 *.cs 文件,它不在设计器文件的“组件设计器生成的代码”区域中。【参考方案2】:

虽然 Sriram 的回答是正确的,但是如果你使用的是非托管类型,比如 COM 对象,你应该使用 Finalizer 模式:

public class MyPictureBox : PictureBox, IDisposable

    private Timer _timer1 = new Timer();
    private Timer _timer2 = new Timer()

    //more of your stuff 

    ~MyPictureBox ()
    
        Dispose(false);
    

    protected override void Dispose(bool disposing)
    
         //clean up unmanaged here

        if(disposing)
        
            _timer1.Dispose();
            _timer2.Dispose();
        

        base.Dispose(disposing);
    

    public void Dispose()
    
        Dispose(true);
        GC.SuppressFinalize(this);
    

查看处理模式:http://msdn.microsoft.com/en-us/library/b1yfkh5e%28v=vs.110%29.aspx

当您使用 PictureBox 时,请记住,图像类型也必须为 IDisposable

【讨论】:

以上是关于自定义控制和处置的主要内容,如果未能解决你的问题,请参考以下文章

如何:自定义主题

如何让自定义导航控制器为每个故事板提供相同的自定义导航栏按钮

自定义控制器包含和导航栏高度

导航控制器和自定义导航控制器

使用 Ryu 控制器和 Python 制作自定义拓扑

wpf中我自定义了一个自定义控件,add到了界面,如何设置显示在最底层?后台代码如何控制?