【关于委托的问题】 本帖最后由 kiba518 于 2012-01-16 10:07:23 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 private EventHandler updateHandler0;//声明一个委托 //这是声明了一个事件,不是传统委托 public Part() { InitializeComponent(); updateHandler0 += new EventHandler(AddComplete0);//委托给一个函数 // 这是事件激发触发的方法 }// click 事件中 private void btnCreate_Click(object sender, RoutedEventArgs e) {AddChildWindow = new AddChildWindow(updateHandler0);//把委托传给了Childwindow 事件}//childwindow中 构造函数里private EventHandler handler;//刷新父页面public AddChildWindow (EventHandler handler) { InitializeComponent(); this.handler = handler;//初始化子窗体的事件 } //还有这个函数是什么意思 private void Update_Completed(object sender, EditNoticeEventArgs e) { handler(null, null);//这是什么 更新完成后 调用这个事件 }个人感觉 这个代码实现的咋这么别扭大体猜测流程 父窗体打开了一个子窗体---->子窗体进行一系列操作触发一个事件---->父窗体更新 Handler就是中间的类似函数指针的变量,用来传递函数的,最终执行的是AddComplete0这个函数。 看Observer(观察者) 模式看你的代码,需求应该就是childwindow中会更新,但是父窗口需要在更新后做些什么事情,因此使用了委托。但是我感觉代码有点问题,好像private EventHandler updateHandler0;//声明一个委托并不需要似的。 代码是你一个人写滴,所以你分清楚这里面的关系建设你把代码看成是两个人写滴。你就明白这个关系了。这就像一盘棋,如果就你一个下,那怎么下都成,都是你一个人控制如果是两个下,你下玩了,就把控制权教给别人了,然后对方下了,你在把控制权交给你这样把,你就把调用方的代码给“黑”掉你只考虑你自己的代码 下棋 { while(棋局没结束) {思考棋子状态,决策自己怎么下 然后我下一个颗子 xxx()//xxx委托,他控制权交给对方 } }xxx就是把控制权交给对方,我写这个代码,根本不管对方怎么处理,就想你上面的东西,我只是把控制权交出去,并把对方需要的环境参数(比如棋盘)送过去,至于对方是刷新,还是入库,还是修改某个状态,和我不管 同样 个人认为private EventHandler updateHandler0 这个是多余的东西其实并不需要 把那些杂七杂八的东西去掉,我把父页面的委托啥啥都去掉,我们来看一下//去掉updateHandler0这个干扰项,直接匿名方法AddChildWindow = new AddChildWindow(()=>{匿名方法,告诉子窗口,你下完子了请把,棋盘换给我,我要还要下});private void Update_Completed(object sender, EditNoticeEventArgs e){ if(handler!=null) //handler!=null 表示父窗口说请在下玩子后通知他 handler(null, null);//通知父窗口把控制权交给父窗口处理,发送着为null,环境参数为null,} AddChildWindow = new AddChildWindow(()=>{匿名方法,告诉子窗口,你下完子了请把,棋盘换给我,我要还要下});这个匿名方法 没有传参数啊那 子窗体中 怎么获取 handler这个委托呢 AddChildWindow = new AddChildWindow((new EventHandler )=>{匿名方法,告诉子窗口,你下完子了请把,棋盘换给我,我要还要下});是不是这样写 AddChildWindow = new AddChildWindow((EventHandler handler)=>{ 事件的匿名是new AddChildWindow((mysernder,mye)=>{我要做的事情}} 求解: .NET 类型和 SQL Server 类型对应问题. .net 中的MD5算法,纯数字和字母数字组合 麻烦高手帮我解决一下关于Socket的问题 一个关于repeater的条件问题 基于SQL SERVER数据库的.NET程序发布问题?详情请进 c#中文件重命名怎样实现? 基于C#的网络带宽测量 rewritew问题 无法找到该页 没有VS.NET集成开发环境,只有SDK,如何用C#写DLL然后在PB中调用? 最后10分:如何让一个FORM程序运行后不出现在进程列表里面? 父类如何调用子类的方法 C#和VC dll传递参数问题
private EventHandler updateHandler0;//声明一个委托
//这是声明了一个事件,不是传统委托 public Part()
{
InitializeComponent();
updateHandler0 += new EventHandler(AddComplete0);//委托给一个函数
// 这是事件激发触发的方法
}// click 事件中
private void btnCreate_Click(object sender, RoutedEventArgs e)
{
AddChildWindow = new AddChildWindow(updateHandler0);//把委托传给了Childwindow 事件
}//childwindow中 构造函数里
private EventHandler handler;//刷新父页面
public AddChildWindow (EventHandler handler)
{
InitializeComponent();
this.handler = handler;//初始化子窗体的事件
}
//还有这个函数是什么意思
private void Update_Completed(object sender, EditNoticeEventArgs e)
{
handler(null, null);//这是什么 更新完成后 调用这个事件
}个人感觉 这个代码实现的咋这么别扭
大体猜测流程 父窗体打开了一个子窗体---->子窗体进行一系列操作触发一个事件---->父窗体更新
但是我感觉代码有点问题,好像private EventHandler updateHandler0;//声明一个委托并不需要似的。
这样把,你就把调用方的代码给“黑”掉你只考虑你自己的代码
下棋
{
while(棋局没结束)
{思考棋子状态,决策自己怎么下
然后我下一个颗子
xxx()//xxx委托,他控制权交给对方
}
}xxx就是把控制权交给对方,我写这个代码,根本不管对方怎么处理,就想你上面的东西,我只是把控制权交出去,并把对方需要的环境参数(比如棋盘)送过去,至于对方是刷新,还是入库,还是修改某个状态,和我不管
//去掉updateHandler0这个干扰项,直接匿名方法
AddChildWindow = new AddChildWindow(()=>{匿名方法,告诉子窗口,你下完子了请把,棋盘换给我,我要还要下});
private void Update_Completed(object sender, EditNoticeEventArgs e)
{
if(handler!=null) //handler!=null 表示父窗口说请在下玩子后通知他
handler(null, null);//通知父窗口把控制权交给父窗口处理,发送着为null,环境参数为null,
}
这个匿名方法 没有传参数啊
那 子窗体中 怎么获取 handler这个委托呢
是不是这样写
我要做的事情}}