开发者社区> 泡泡浅眠> 正文

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

简介:
+关注继续查看

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

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

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

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

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

-》输入:Login.xaml

回车一页面就出来了。

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

复制代码
ExpandedBlockStart.gif
 <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 = "";//昵称

 

事件代码:

复制代码
ExpandedBlockStart.gif
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和昵称,

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

复制代码
ExpandedBlockStart.gif
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就算了,我们再看看这下代码:

复制代码
ExpandedBlockStart.gif
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控件,就可以实现转向了。

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

 

复制代码
ExpandedBlockStart.gif
//这是原来的方法
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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
25237 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
18992 0
+关注
2248
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载