1

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

谢谢!

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

        }
    }
}
4

2 回答 2

1

可能发生的情况是事件在您.Detach()调用后被触发,或者根本不会被触发。我将从删除listener.Detach()呼叫开始。通常,您在创建表单或加载表单时附加到事件,并在卸载表单时将其分离。

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

于 2012-10-11T00:55:12.443 回答
0

感谢您分享您的想法!

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

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

我也更新了上面的源代码

于 2012-10-11T01:08:42.017 回答