设计完了自定义控件的外观,接下来我们要设计自定义控件的事件响应,在本例中我们添加此控件的Click事件。
1、添加事件
实现 Silverlight 控件中的事件通常与实现普通的 Microsoft® .NET Framework 类中的事件一样:您只需声明控件类中的事件,然后编写代码引发这些事件。
但是与 Silverlight 中事件引发稍有不同的一点是:Silverlight 支持路由事件。在 Siverlight 中,事件只能向上传递,即“冒泡”操作。路由事件由 RoutedEventHandler 委托定义,并且路由事件处理程序接收 RoutedEventArgs 对象,该对象包含用于确认引发此事件的对象的 Source 属性(如果此事件最初由可视树中的深层对象引发,则该属性不同于传递给事件处理程序的发送者参数)。内置 Button 控件的 Click 事件是一个路由事件,因此 SimpleButton 的 Click 事件也应该是路由事件。
显示了为引发路由 Click 事件,必须对 MySilverButton.cs 中的控件类做修改。现在,我们要在MySilverButton的构造函数中为 MouseLeftButtonUp 事件注册一个处理程序。如果至少存在一个注册的侦听器,则此处理程序就可以引发 Click 事件。如果 button-down 事件先于 button-up 事件,则传统的按钮控件只能引发 Click 事件。为使源代码尽可能简单,MySilverButton中省略了该逻辑。
需要添加的代码如下:
this .MouseLeftButtonUp += new MouseButtonEventHandler(SimpleButton_MouseLeftButtonUp); // 添加到构造函数中
void SimpleButton_MouseLeftButtonUp( object sender, MouseButtonEventArgs e)
{
if (Click != null )
Click( this , new RoutedEventArgs());
}
完整代码如下:
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace MyDesignButton
{
public class MySilverButton: ContentControl
{
public event RoutedEventHandler Click; //添加Click事件
public MySilverButton()
{
this.DefaultStyleKey = typeof(MySilverButton);
this.MouseLeftButtonUp += new MouseButtonEventHandler(SimpleButton_MouseLeftButtonUp); //添加Click事件
}
//添加Click事件
void SimpleButton_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (Click != null)
Click(this, new RoutedEventArgs());
}
}
}
2、测试事件响应
要测试 Click 事件,我们需要回到MySLbutton项目,修改 Page.xaml 中的控件声明,如下所示:
</ custom:MySilverButton >
然后在 Page.xaml.cs 中编写MyFirstSLbutton_Click事件处理程序,代码如下:
{
System.Windows.Browser.HtmlPage.Window.Alert( " Click事件生效! " );
}
生成项目后运行,现在,单击 Button 应生成一个包含单词“Click事件生效!”的警告框 — 证明已引发并正确处理了此事件:
下一篇:
SilverLight学习笔记--建立Silverlight自定义控件(3)--操作控件内部成员 前往:Silverlight学习笔记清单