Delegate不通知该方法

时间:2012-10-11 00:43:03

标签: c# delegates

你看看我的代码并告诉我哪里出错了吗?在下面的代码中,我试图在Form1最大化时向myMethod()方法发送通知。

谢谢!

namespace WindowsDelegate1
{

    public delegate void ChangedEventHandler(object sender, EventArgs e);

    class myForm : Form
    {
        public event ChangedEventHandler Changed;

        protected virtual void OnChanged(EventArgs e)
        {
            if (Changed != null)
                Changed(this,e);
        }

        public override System.Drawing.Size MaximumSize
        {
            //get
            //{
            //    return base.MaximumSize;
            //}
            set
            {
                base.MaximumSize = value;
                OnChanged(EventArgs.Empty);
            }
        }
    }
}


namespace WindowsDelegate1
{
    class EventListener
    {
        private myForm TheForm;

        public EventListener(myForm theform)
        {
            TheForm = theform;
            TheForm.Changed += new ChangedEventHandler(myMethod);
        }

        private void myMethod(object sender, EventArgs e)
        {
            MessageBox.Show("hey, window should be maximized now!");
        }

        public void Detach()
        {
            TheForm.Changed -= new ChangedEventHandler(myMethod);
            TheForm = null;
        }
    }
}

这是测试单元/或main()

namespace WindowsDelegate1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            myForm f = new myForm();
            EventListener listener = new EventListener(f);
            f.ShowDialog();
            f.WindowState = FormWindowState.Maximized;
            listener.Detach();

        }
    }
}

2 个答案:

答案 0 :(得分:1)

可能发生的事件是,在您.Detach()来电之后,该事件会被解雇,或者根本不会被解雇。我首先删除listener.Detach()电话。通常,您在创建表单时或在卸载时加载和分离时附加到事件。

除此之外,您的Detach方法存在问题,因为它尝试删除与添加的实例不同的ChangedEventHandler实例。如果要将方法包装在ChangedEventHandler中,则需要存储添加的实例。

答案 1 :(得分:0)

感谢您分享您的想法!

我通过删除属性来修复它(不知道我为什么使用它!!)并使用方法代替:

protected override void OnActivated(EventArgs e)
{
    base.OnActivated(e);
    OnChanged(EventArgs.Empty);
}

我上面也更新了我的源代码