簡體   English   中英

委托不通知方法

[英]Delegate doesn't notify the method

您能否看一下我的代碼並告訴我哪里出了問題? 在以下代碼中,我試圖在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();

        }
    }
}

可能發生的情況是該事件要么在您的.Detach()調用之后觸發,要么根本沒有觸發。 我將從刪除listener.Detach()調用開始。 通常,您在創建表單或加載表單時附加事件,並在卸載時分離。

除此之外,您的Detach方法還有問題,因為它試圖刪除與ChangedEventHandler實例不同的ChangedEventHandler實例。 如果將方法包裝在ChangedEventHandler ,則需要存儲添加的實例。

感謝您分享您的想法!

我固定它通過消除財產(不知道為什么我用!!)和使用方法,而不是通過:

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

我也更新了我的源代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM