转帖地址: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里也初始化很多代码的。
下节,我们创建房间大厅,然后让转向转到房间大厅里。