• 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里也初始化很多代码的。

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

    版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
    个人微信公众号
    创业QQ群:617713515
    Donation(扫码支持作者):支付宝:
    Donation(扫码支持作者):微信:
  • 相关阅读:
    Restful、SOAP、RPC、SOA、微服务之间的区别
    SOA(面向服务的架构.)、RPC(远程过程调用)思想
    facade层,service 层,domain层,dao 层设计
    Mac下配置alias,zsh终端命令别名
    .bash_profile 和.zshrc
    什么是零担物流?零担物流的五大特点
    零担是什么意思,零担物流和快递有什么区别
    idea vm options
    idea中 VM options配置
    ES配置生命周期策略
  • 原文地址:https://www.cnblogs.com/cyq1162/p/1775535.html
Copyright © 2020-2023  润新知