在本章里,由灵会为您介绍Silverlight的事件相关知识和实例。Silverlight使用了事件冒泡的机制,和Web中的JavaScript事件是一样!每一个控件都可以有自己独有的事件,本文会为大家介绍常用控件的事件。 先简单介绍下事件冒泡机制,理解的朋友要以先跳过此节。Silverlight是使用控件套用控件实现的,比如一个button必须在Canvas容器控件内,所以在点击Button的时候,如果Canvas指定了MouseLeftButtonDown事件,会先执行Button的MouseLeftButtonDown事件,随后执行Canvas的MouseLeftButtonDown事件。 常规事件的绑定有三种方法可以实现,在此为大家介绍。
1、在XAML的控件标记中添加属性制定,以属性="事件的执行名称"。 <Canvas onLeftButtonDown="leftButtonDown"></Canvas> 2、使用JavaScript的指定。。
_silverlight_control.content.findName("controlName").addEventListener("onLeftButtonDown",functionName); 3、使用MSIL的DLL中绑定(只限于Silverlight1.1以上版本)。。
silverlight_control.MouseLeftButtonDown += new System.Windows.Input.MouseEventHandler(silverlight_control_MouseLeftButtonDown); 您可以自定义事件方法,如果想在JavaScript中使用.cs或.vb中声明托管事件,必须要使用[ScriptableType]和[ScriptableMember]标记声明。
下面我们列出常用的事件列表: 事件名称 所在控件 说明。
| 事件名称 |
所在控件 |
说明 |
| Loaded |
UIElement基类 |
子控件加载后发生 |
| OnResize |
System.Windows.Interop.BrowserHost |
静态方法,大小重设是发生 |
| OnFullScreenChange |
System.Windows.Interop.BrowserHost |
静态方法,全屏改变时发生 |
| MouseLeftButtonDown |
UIElement基类 |
鼠标点击发生 |
| MouseLeftButtonUp |
UIElement基类 |
鼠标放开时发生 |
| MouseLeave |
UIElement基类 |
鼠标移开时发生 |
| MouseEnter |
UIElement基类 |
鼠标经过时发生 |
| DownloadProgressChanged |
Image, Downloader, MediaElement |
进度更改时发生 |
| GotFocus |
UIElement基类 |
获得焦点时发生 |
| LostFocus |
UIElement基类 |
失去焦点时发生 |
| ImageFailed |
Image |
图像失败时发生 |
| BufferingProgressChanged |
MediaElement |
缓冲更改时发生 |
| CurrentStateChanged |
MediaElement |
播放状态更改时发生 |
| MediaEnded |
MediaElement |
播放停止时发生 |
| MediaFailed |
MediaElement |
播放失败时发生 |
| MediaOpened |
MediaElementss |
打开以后发生 |
| KeyDown |
UIElement基类 |
键盘按下时发生 |
| KeyUp |
UIElement基类 |
键盘起来时发生 |
| Completed |
Storyboard |
播放完时发生 |
实例:
C#
using System; 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; using System.Windows.Browser; namespace main_app_wpfhome { [ScriptableType] public partial class Page : UserControl { public Page() { // Required to initialize variables InitializeComponent(); this.Loaded += this.Page_Loaded; } private void Page_Loaded(object sender, EventArgs args) { // Required to initialize variables. Needs to be done from loaded event so FindName works properly. System.Windows.Browser.HtmlPage.RegisterScriptableObject("Page", this); Storyboard1.Completed += new EventHandler(Storyboard1_Completed); // Insert code required on object creation below this point. }
void Storyboard1_Completed(object sender, EventArgs e) { if (Finish != null) { Finish(sender, e); } } [ScriptableMember] public event EventHandler Finish; } }
其中System.Windows.Browser.HtmlPage.RegisterScriptableObject("Page", this);是把自身在JavaScript声明,让Javascript所调用!这一步是非常重要的,但是其中this对象必须使用[ScriptableType]标识声明才可以。下面JavaScript片段实现了对象的调用。
JavaScript代码段:
var silverlightControl; function sl_load(sender,arg) { silverlightControl=document.getElementById('Silverlight1'); silverlightControl.content.Page.Finish=window.finish_handler; silverlightControl.content.root.addEventListener("MouseLeftButtonDown",rePlay); } function finish_handler(sender,arg) { document.getElementById('RePlay').style.display='inline'; } function rePlay() { var cc=silverlightControl.content.findName("Storyboard1"); cc.Stop(); cc.begin(); document.getElementById('RePlay').style.display='none'; }
本实例是一个事件交互的程序,首选用Blend在Xaml中制做出一个动画Storyboard的实例对象。使用程序声明事件,并用Javascript调用事件委托。虽然可以在JavaScript中直接使用Storyboard. Completed实现,但在此实现JavaScript与C#事件托管实现!
运行效果如下:
|