Silverlight+WCF 新手实例 象棋 登陆与转向(十一)

好了,从这节起,我们可能要暂时远离我们的象棋库了,因为我们要开始进入一些周边的事情了。

像登陆啊,登陆后创建房间大厅啊,进入后除了象棋还有用户列表,聊天窗口等等,中间少不了WCF通讯。

好了,开始登陆小节,先上一张小图:

看,多简洁,一个ID一个昵称一个登陆就完了。虽然简洁,可是也会有很多想法的。

不过想法待会再说,新建页面先:对着Silverlight应用程序右键-》添加新建项-》Silverlight用户控件

-》输入:Login.xaml

回车一页面就出来了。

往页面里拉两个TextBlock,两个TextBox,一个Button[双击后就有一个Click事件了],如下:


 <Grid x:Name="LayoutRoot" Background="White" Height="144" Width="192">
        <TextBox Height="23" HorizontalAlignment="Left" Margin="37,68,0,0" Name="txtNickName" VerticalAlignment="Top" Width="143" />
        <Button Content="登陆" Height="23" HorizontalAlignment="Left" Margin="65,109,0,0" Name="btnLogin" VerticalAlignment="Top" Width="75" Click="btnLogin_Click" />
        <TextBlock Height="23" HorizontalAlignment="Left" Margin="6,68,0,0" Name="textBlock1" Text="昵称:" VerticalAlignment="Top" Width="35" />
        <TextBox  Height="23" HorizontalAlignment="Left" Margin="37,29,0,0" Name="txtUserID" VerticalAlignment="Top" Width="143" />
        <TextBlock Height="23" HorizontalAlignment="Left" Margin="6,29,0,0" Name="textBlock2" Text="ID:" VerticalAlignment="Top" />
    </Grid>

 

改下名称改下ID,噢,注意,没ID了,全都是Name了。

好,界面有好,双击那个Button也有btnLogin_Click事件了。

我们右键,查看代码,进入cs代码页面:

我们先看一下btnLogin_Click事件写什么代码:

全局变量:

Guid userID;//用户ID
string nickName = "";//昵称

 

事件代码:


private void btnLogin_Click(object sender, RoutedEventArgs e)
        {
            nickName = txtNickName.Text.Trim();
            if (nickName == "")
            {
                MessageBox.Show("请输入昵称!");
                return;
            }
            if (nickName.Contains(","))
            {
                MessageBox.Show("昵称不能包含非法字符!");
                return;
            }
            btnLogin.IsEnabled = false;
            //设置Cookie
            System.Windows.Browser.HtmlPage.Document.Cookies =userID + "," + nickName;
            //紧接着转到房间页面去,咋转?
        }

 

对昵称进行判断,然后写Cookie,之后页面转向,这里少了一个ID,还有就是页面咋转的问题。

为什么这里不对ID是不是为空进行判断?因为我们要补充一个Load方法,让页面加载时,先从Cookie里读读看有没有用户ID和昵称,

有的话就直接显示在文件框上:


public Login()
        {
            InitializeComponent();
            Load();
        }
        private void Load()
        {
            LoadFromCookie();
            txtUserID.Text = userID.ToString();
            txtUserID.IsReadOnly = true;
            txtNickName.Text = nickName;
        }
        private void LoadFromCookie()
        {
            string cookies = System.Windows.Browser.HtmlPage.Document.Cookies;
            if (cookies.Contains(","))
            {
                string[] para = cookies.Split(',');
                if (para.Length == 2 && para[0].Length == Guid.Empty.ToString().Length)
                {
                    userID = new Guid(para[0]);
                    nickName = para[1];
                    return;
                }
            }
            userID = Guid.NewGuid();
        }

 

最长一点的就是从Cookie里拿ID和昵称,按“,”号分隔下,如果没Cookie,默认就的ID就NewGuid()一下了。

读取后,我们默认给txtUserID设置了值并设置为只读,所以啊,我们的Click事件里并没有对ID进行处理了。

接下来我们来看看怎么转向?其实转向啊,博园里就有相关文章了,很N个人写过,不过都是一个样的,谁是第二手来源已说不清了。

不过原创的一定是微软官方了。

我们看一下Silverlight应用程序下,是不是有一个App.xaml,我们点进去看看它的代码,看下这行:

private void Application_Startup(object sender, StartupEventArgs e)
        {
            this.RootVisual = new MainPage();
        }

 

默认第一手启动的是MainPage,如果我们换成new Login(),那启动的首页面就是Login页了。

不过了,这里不是设为Login就算了,我们再看看这下代码:


Grid root = new Grid();//全局变量
private void Application_Startup(object sender, StartupEventArgs e)
        {
            this.RootVisual = root;
            root.Children.Add(new Login());
        }

//自定义方法转向。
        public void RedirectTo(Control ct)
        {
            root.Children.Clear();
            root.Children.Add(ct);
        }

 

看到没有,小小改动了两行代码,只要调用RedirectTo方法,来切换root控件,就可以实现转向了。

这里我们顺便改一下另一行代码,最下面那行:

 


//这是原来的方法
private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
        {
            try
            {
                string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
                errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");

                System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
            }
            catch (Exception)
            {
            }
        }
//我们把它改成这样:
private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
        {
            try
            {
                string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
                errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");

                System.Windows.Browser.HtmlPage.Window.Alert("Error: " + errorMsg );
            }
            catch (Exception)
            {
            }
        }

 

其实就是把Eval改成Alert,这样在出现未捕获异常的时候,弹出下说明就行了,不用弹出那个调试器。

OK了,转向函数已经有了,我们可以在登陆页里写上转行代码了:

 //紧接着转到房间页面去,咋转?就这里补上一行代码而已
            ((App)(Application.Current)).RedirectTo(new MainPage());

 

我们运行F5一下看下效果:

起始登陆:

点击登陆,转入MainPage页

OK,正常转向了。

登陆就先讲到这了,当然,随着WCF通讯开始后,我们肯定会回来登陆页做很多事情,而且会在App里也初始化很多代码的。

下节,我们创建房间大厅,然后让转向转到房间大厅里。

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2010/07/12/1775535.html

时间: 2024-08-03 18:29:30

Silverlight+WCF 新手实例 象棋 登陆与转向(十一)的相关文章

Silverlight+WCF 新手实例 象棋 介绍四(三十一)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 另专题索引更已更新到三十:Silverlight+WCF 新手实例 象棋 专题索引 由于新增加了功能,所以,又要小小的介绍一下了 这节的介绍应该是非常简短了,因为新加的功能不多 1:首先,入场的是登陆,看小图,发现有点小变化了吧: 增加了单机入口,单机测试版本正式登陆!   2:用户对战增加默认[30分钟]计时.  红方开始计时开始:   黑方计时开始:   3:接下来进入到我们的单机版本了界面了: A:默认进入的界面  

Silverlight+WCF 新手实例 象棋 主界面-事件区-游戏开始(二十七)

本专题出产简单原由: 一开始的初衷,只是想写个简单的单机BS人机对战版的,开始还下了点AI算法看看的: 但是写到最后,都写成了通讯版本的对战了,只因中间不小心看到了WCF的相关内容,顺便加了进来; 最后就定局了,反正新手实例,能加多点内容就加多点了. 关于原始初衷,后期再补上了.       好了,先上几个附加索引: 1:Silverlight+WCF 新手实例 象棋 在线演示 2:Silverlight+WCF 简单部署问题集 3:Silverlight4 ListBox bug 4:Silv

Silverlight+WCF 新手实例 象棋 回归WCF通讯应用-登陆(十八)

前四节,我们讲了通讯基础,从这节起,我们回归到项目中来,要将前面的WCF通讯知识应用进来. 之前的项目大伙没丢把,重新发下载地址:之前第3阶段代码:点此下载   我们为Chess项目的解决方案里,再添加WCF应用服务程序 由于Silverlight+WCF 新手实例 象棋 WCF通讯跨域(十五)已截图,所以这里不截图了. 步骤: 1.对着解决方案->右键->添加新建项目->选择WCF应用服务程序->输入:GameService 2.删除默认的IService1.cs和IServic

Silverlight+WCF 新手实例 象棋 主界面-事件区-返回退出(三十三)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   还是那张图:  本节实现返回大厅和退出系统: 一:返回大厅,其实很简单的说,就是转向房间列表了. 可是,转向前也有很多事情要处理的: 1:退出前要通知服务器,说我要退出了,不然其它人看到你在房间里占着毛坑又不拉. 2:如果已经在游戏中,你还得先"认输" 3:没其它事了,直接就返回大厅了. 二:退出系统,和返回大厅一样,只是最后结果的转向不一样,只是转向登陆界面.   这里就产生第一个问题了,怎么知道自己是在游戏

Silverlight+WCF 新手实例 象棋 主界面-棋盘区(二十二)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   这节我们要布局Index.xaml界面. 首先,我们定义一下全局的宽和高:1000*620[数字差不多就行了] 一堆代码,都是自动生成的,只是改了两个数字,不说大伙也知道改啥数字了. <UserControl x:Class="NewChessProject.Index"     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presen

Silverlight+WCF 新手实例 象棋 房间状态更新(二十)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   这节开始,标题里就去掉"回归WCF通讯应用"几字了.   上节我们成功实现了进入房间,服务端也收到用户进入房间的请求了,这节,我们服务端收到进入房间请求后,通知在房间大门外的人更新房间状态. 我们要增加一个回调方法,ICallBack接口那,忘记的人回去看看WCF通讯那几篇(十四到十七节). 方法如下,以前说过了,回调的方法是给客户端实现的,服务端只管调就行了: using System.ServiceMode

Silverlight+WCF 新手实例 象棋 获取房间状态列表更新(二十一)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   上节是当有用户进入某个房间时,我的某个房间状态被通知,并被通知更新. 这节说说首次进入房间大厅时,我们自己创建了N个房间,默认都是初始状态的,这时我们需要获取服务端的所有已更新的房间状态, 下到本地之后,进行批量更新状态.   于是开始了,首先从服务端开始,我们要获取所有已更新的房间,于是到WCF服务端添加一个方法: 到IService.cs添加方法接口 [OperationContract] Dictionary<in

Silverlight+WCF 新手实例 象棋 介绍III(二十三)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   虽然有在线演示,不过还是要写一个介绍,因为并没有实时更新到在线演示 说是介绍,其实就是阶段进度报告,现在看一下最近的更新吧: 先来总体截一下图看看变化吧: 1.登陆: 增加了初始作者文字显示[没用户时默认文字],和在当前线用户数显示. 我开了三个浏览器窗口才截到这图. 2:房间: 这里从QQ象棋里弄了两张背景图过来,换了一下之前的房间背景,如果是游戏对战中,桌面背景就变成了: 3:增加倒计时子窗口实现,替换掉了Messa

Silverlight+WCF 新手实例 象棋 主界面-棋谱-获取列表(三十八)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   在Silverlight+WCF 新手实例 象棋 主界面-棋谱-布局写谱(三十六)中,我们完成下棋双方的棋谱显示,这节,我们为观众增加棋子列表: 观众进入房间后,第一时间当然也要获取棋步列表了,不然进来干麻呢?你当这是聊天室啊,光聊天不看棋.   首先,当然是要在服务端添加一个获取棋步列表的接口方法了: WCF服务端,IService.cs:  /// <summary>     /// 服务端方法接口 by 路过秋天