SilverLight学习笔记--如何在xaml文件中操作用户在后台代码定义的类(2)--示例篇:创建一个登录控件(原创)(转载本文请注明出处)

本文将示例如何运用前篇所写知识来建立一个用户自定义的登录控件。此控件界面非常简单,主要涉及的知识点是:
  如何创建用户控件(包括对此控件的自定义事件和属性的编写,此处我们将创建一个名为LoginBox和LoginButton两个用户控件,其中,LoginBox控件内含LoginButton控件,LoginButton控件继承自Button控件。LoginBox和LoginButton两个控件之间将通过自定义事件和自定义属性进行交互) 如何创建一个用C#编写的后台代码类(UserDetail.cs),并在xaml文件中操作它(实例化它的一个类对象并把它和上面创建的用户LoginBox控件的自定义属性(名为UserName的属性)进行数据绑定,并在控件加载时自动显示出来)
  下面,进入我们的具体操作:
  首先,我们打开VS2008,选择新建项目,项目名命名为LoginCtrlWeb,这是我们新建的解决方案,其下有两个项目,分别名为 LoginCtrlWeb 和 LoginCtrlWeb .Web

一、创建LoginButton控件
 在LoginCtrlWeb项目下添加一个新建类,名称为 LoginButton.cs,此类继承自Button类,我们将在此类中自定义一个名为OnMyBtnClick的事件。
我们知道,自定义事件通常涉及到事件的发起方和事件的接收方,通常有4个具体步骤:
(1)、在事件发起方中定义一个事件(首先声明一个与事件相关联的委托类型 A,然后声明事件B,并把它和我们前面声明的代理类A关联起来)
(2)、在事件发起方中触发上面定义的事件B
(3)、在事件接收方定义上述事件的事件处理程序
(4)、事件接收方向事件发起方订阅一个事件在此代码中,
 注意在.NET Framework中,涉及事件的各元素的命名规则如下(例如事件名为 EventName):
   事件传递参数  EventName + EventArgs
   事件涉及的委托类 EventName + EventHandler (object sender,EventNameEventArgs e)
   事件名   OnEventName
   在引发事件的类中提供一个受保护的虚方法: On+EventName,防止可能存在的线程同步问题

  protect virtual void OnEventName(EventNameEventArgs e)
  {
        
if(EventName !=null)
         {
             EventName(
this.e);
          }
  }

   作为自定义事件OnMyBtnClick的发起方LoginButton,我们需要在它这里完成的工作包括:
定义一个事件OnMyBtnClick和 定义一个触发上述事件的方法MyBtnClick,此外,我们还自定义了一个名为OnMyBtnClickEventArgs的参数类用于事件传参,此类继承自EventArgs类。
  具体代码如下:

Code

 

  二、创建loginBox控件。
  接下来,我们将创建loginBox控件,在此控件中,我们要用到上面创建的loginButton控件,步骤如下:
  1、在LoginCtrlWeb项目下添加一个新建项(项目类型是:Silverlight用户控件),此新建项命名为LoginBox.xaml,先创建它的界面:
Code

 由于要用到控件loginButton,所以,我们需要在xaml文件头引用
 xmlns:custom="clr-namespace:LoginCtrlWeb"
   2、LoginBox.xaml.cs后台代码编写
  包括两方面的任务,一是为loginBox自定义控件添加一个新属性UserName,二是为LoginBox控件添加loginButton控件所传递过来的OnMyBtnClick事件的事件处理程序
  首先,我们添加新属性,代码如下:
Code

  然后,我们添加OnMyBtnClick事件的事件处理程序getLoginUserInfo,此程序就是事件委托类的一个具体实例,代码如下:
Code
其中包括另一个子程序 ChekPassword,用于对用户名和密码进行核对,我们在此处假设核对通过并返回true代码如下
Code

 接下来,我们需要订阅OnMyBtnClick 事件,并触发事件,此段代码我们放在loginButton控件的Click事件处理代码中.
Code

  LoginBox.xaml.cs完整程序代码如下:
Code
  三、在Page.xaml文件中运用我们创建的自定义控件loginBox.
 此处我们需要做如下工作:
 1、新建一个UserDetails类,代码如下:
Code

2、在Page.xaml文件中初始化一个UserDetails类的实例,代码如下 :
    <UserControl.Resources>
        
<custom:UserDetails UserName="Jack" x:Key="myUserDetials"/>
    
</UserControl.Resources>
  当然,我们需要在Page.xaml文件头部加入引用
   xmlns:custom="clr-namespace:LoginCtrlWeb"
  这样,我们才能真正在xaml文件中操作此类
3、在Page.xaml文件中加入我们的自定义控件loginBox
Code
   从代码中我们可以看到,当我们加入我们的自定义控件loginBox时,我们对此控件的自定义属性UserName进行了初始化赋值,赋值方式就是把它和我们定义的UserDetails类的一个实例进行绑定,而对UserDetails类所进行的初始化操作是在xmal文件中完成的。
 Page.xaml完整代码如下:
Code


   最后,按F5测试,可看到loginBox控件在加载时就已经绑定了用户名 Jack,点击自定义的登录按钮后,在下面将显示"用户 Jack 正常登录本系统"提示信息.
   说明:本文只重在知识点的展示,即通过本例加深对上述知识点的理解,实际操作并非如此,比如,我们对Button控件的Click事件又另定义了一个OnMyBtnClick自定义事件,并把它放入到Click事件的处理程序中进行触发,在此处实际就是多此一举,在我们只是通过这种操作来进行说明,实际上你可以用到本文的相关知识,加入其它事件的自定义,而不仅是Click事件的定义.

前往:Silverlight学习笔记清单
本文程序在Silverlight2.0和VS2008环境中调试通过。本文参照了部分网络资料,希望能够抛砖引玉,大家共同学习。
(转载本文请注明出处)

posted @ 2009-07-21 11:26  wsdj  阅读(2776)  评论(0编辑  收藏  举报