你看看我的代码并告诉我哪里出错了吗?在下面的代码中,我试图在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();
}
}
}
答案 0 :(得分:1)
可能发生的事件是,在您.Detach()
来电之后,该事件会被解雇,或者根本不会被解雇。我首先删除listener.Detach()
电话。通常,您在创建表单时或在卸载时加载和分离时附加到事件。
除此之外,您的Detach
方法存在问题,因为它尝试删除与添加的实例不同的ChangedEventHandler
实例。如果要将方法包装在ChangedEventHandler
中,则需要存储添加的实例。
答案 1 :(得分:0)
感谢您分享您的想法!
我通过删除属性来修复它(不知道我为什么使用它!!)并使用方法代替:
protected override void OnActivated(EventArgs e)
{
base.OnActivated(e);
OnChanged(EventArgs.Empty);
}
我上面也更新了我的源代码