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

    技术2022-06-25  52

    转帖地址:http://www.cnblogs.com/cyq1162/archive/2010/07/12/1775535.html

     

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

    像登陆啊,登陆后创建房间大厅啊,进入后除了象棋还有用户列表,聊天窗口等等,中间少不了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里也初始化很多代码的。

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


    最新回复(0)