Silverlight+WCF 实战-网络象棋最终篇之解决重复的消息提示(八)
来源:互联网 发布:淘宝滑膛弹弓专卖店 编辑:程序博客网 时间:2024/05/16 01:06
一:分析问题产生的原因?
1:首先看App.xaml,里面定义了一个全局客户端回调:
并且这个回调我们全局只实例化一次,并且默认加载时定位到登陆页面:
{
this.RootVisual = root;
root.Children.Add(new Login());//默认定位到登录页面。
}
2:再看登录页面Login.xaml里,构造函数的初始化:
{
InitializeComponent();
App.client.LoginCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(client_LoginCompleted);
Load();
}
我们对App.client.LoginCompleted初始化了一次事件,这时一切是正常的,接着我们进入房间,之后,我们返回系统回到登陆。
3:接着看退出系统的按钮是怎么返回到登陆页面的:
private void btnLogout_Click(object sender, RoutedEventArgs e)
{
if (App.chess.IsGaming)
{
btnGameLose_Click(null, null);//发送认输
App.chess.IsGaming = false;
}
App.client.OutRoomAsync(App.player, App.player.RoomID, App.player.AttachInfo);
((App)Application.Current).RedirectTo(new Login());
}
看最后一行,我们又New Login了,这种情况,刚才第二步中的:App.client.LoginCompleted事件将被重复注册,因此,重复的事件注册引发了重复的消息提示。
问题总结说明:
二:解决消息重复问题
先来看一下错误任法:注册事件前加先减,再加,示例代码如下:
App.client.LoginCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(client_LoginCompleted);
网上有人说:每次注册前先去掉一下,然后再增加,逻辑上看起来好像没问题,刚自己试了下,纯忽悠型。
现在介绍下我想到的两种方式:
1:定义全局变量List<事件名称>,保存注册过的事件名称
2:定义全局变量保存所有房间,于是在RedirectTo切换房间的时候,避免使用New 控件() 来避免再次执行事件注册事件
下面进行代码整改:
A:App.xaml全局定义每个房间的变量,并改造成属性,所幸控件就几个,定义也费不了多少力,代码如下:
public static Login LoginObj
{
get
{
if (loginObj == null)
{
loginObj = new Login();
}
//loginObj.Reset();
return loginObj;
}
}
private static Room roomObj;
public static Room RoomObj
{
get
{
if (roomObj == null)
{
roomObj = new Room();
}
//roomObj.Reset();
return roomObj;
}
}
private static Index indexObj;
public static Index IndexObj
{
get
{
if (indexObj == null)
{
indexObj = new Index();
}
//indexObj.Reset();
return indexObj;
}
}
说明:
B:查找调用RedirectTo切换界面的代码,替换为:App.xxxxObj
说明:
OK,消息提示重复的问题,至此,是解决了,但是,将产生一点副作用,就是切回去的时候,状态需要重置。
简单的示例说明就是:
OK,状态重置的问题,就留到下节解决了。
本节没关联啥好看图片,就随便挂一张在下面让大伙欣赏了:
最后:谢谢大家对本系列的喜欢,谢谢支持~
同时欢迎大家多到 秋色园 走走~~~
PS:传说点一下推荐会有10个园豆的规则已经取消了,不过,喜欢的还是可以点一下“推荐”,thank you very much!!
- Silverlight+WCF 实战-网络象棋最终篇之解决重复的消息提示(八)
- Silverlight+WCF 实战-网络象棋最终篇之解决重复的消息提示-状态重置(九)
- Silverlight+WCF 实战-网络象棋最终篇之房间装修-WCF端(二)
- Silverlight+WCF 实战-网络象棋最终篇之非线程阻塞倒计时窗口-应用篇(七)
- Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)
- Silverlight+WCF 实战-网络象棋最终篇之非线程阻塞倒计时窗口(四)
- Silverlight+WCF 实战-网络象棋最终篇之房间装修-Silverlight端[带第九阶段源码](三)
- Silverlight+WCF 实战-网络象棋最终篇之对战视频-上篇[客户端开启视频/注册编号/接收视频](五)
- Silverlight+WCF 实战-网络象棋最终篇之对战视频-下篇[客户端发送与服务端中转](六)
- Silverlight+WCF 新手实例 象棋
- Silverlight+WCF 新手实例 象棋 棋子移动-规则[将、马、士、相、炮](八)
- Silverlight+WCF 新手实例 象棋 棋子移动-规则[将、马、士、相、炮](八)
- Silverlight+WCF 新手实例 象棋 主界面-控件消息传递(二十六)
- 解决 silverlight 安装错误:提示消息ID1603 的方法
- Silverlight+WCF 新手实例 象棋 介绍(一)
- Silverlight+WCF 新手实例 象棋 棋盘(二)
- Silverlight+WCF 新手实例 象棋 棋子(三)
- Silverlight+WCF 新手实例 象棋 介绍(一)
- 实战篇-六十六行完成简洁的Rss输出类
- Silverlight+WCF 实战-网络象棋最终篇之非线程阻塞倒计时窗口-应用篇(七)
- 带线的无限级下拉树列表-完整示例篇
- QBlog博客 V2.5 版本发布 增加健康频道[支持多语言、多用户、多数据库、目录级URL]
- CYQ.Data 轻量数据层之路 V4.0 版本发布
- Silverlight+WCF 实战-网络象棋最终篇之解决重复的消息提示(八)
- Silverlight+WCF 实战-网络象棋最终篇之解决重复的消息提示-状态重置(九)
- 实战篇-通用的页面列表导出Excel控件
- 实战篇-简单多语言的实现
- CYQ.Data 轻量数据层之路 V4.3 版本发布[增加对SQLite,MySQL数据库的支持]
- 如何安装部署秋色园QBlog站点
- ClaudiaIDE Visual Studio 2015弄个背景图
- 秋色园[CYQ.Data]开源团队寻人
- CYQ.Data 数据框架 发放V1.5版本源码