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 に答える