在silverlight 中,我们可以通过js事件绑定方法addEventListener,往xaml文件中的UIElement元素上绑定事件js事件,也可以通过直接属性赋值的方法来将事件绑定到UIElement元素上,比如下面的语法声明:
<
Rectangle
x:Name
="
首先我们需要定义一个Silverlight JScript 文件,并将其命名为MoveScene.xaml,如下图所示:
这时系统会生成两个文件,一个是同名的MoveScene.xaml,而另一个就是其绑定的js文件:
MoveScene.js。我们可以将相应的代码放入这两个文件中,其中xaml代码如下:
这时系统会生成两个文件,一个是同名的MoveScene.xaml,而另一个就是其绑定的js文件:
MoveScene.js。我们可以将相应的代码放入这两个文件中,其中xaml代码如下:
Canvas
xmlns
="http://schemas.microsoft.com/client/2007"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
Width ="300" Height x:Name ="rootCanvas" Background ="pink" >
Ellipse ="MouseEllipse"
Height ="100" Width
Canvas.Left ="30" Canvas.Top Fill ="Red" /> TextBlock ="Status" ="140" MouseLeftButtonDown ="onMouseLeftButtonUp"
</ Canvas
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
Width ="300" Height x:Name ="rootCanvas" Background ="pink" >
Ellipse ="MouseEllipse"
Height ="100" Width
Canvas.Left ="30" Canvas.Top Fill ="Red" /> TextBlock ="Status" ="140" MouseLeftButtonDown ="onMouseLeftButtonUp"
</ Canvas
上面代码中定义了两个元素:
1. Ellipse元素,名称为:MouseEllipse,该元素将会绑定鼠标事件。
2. TextBlock元素,名称为:Status,该元素会显示当前鼠标在MouseEllipse元素中的位置。
下面就是关于鼠标事件绑定的代码(因系统已为我们生成了一个简单的初始化代码,我们仅需放入相应的事件绑定代码即可),取终代码结构如下( MoveScene.js):
1. Ellipse元素,名称为:MouseEllipse,该元素将会绑定鼠标事件。
2. TextBlock元素,名称为:Status,该元素会显示当前鼠标在MouseEllipse元素中的位置。
下面就是关于鼠标事件绑定的代码(因系统已为我们生成了一个简单的初始化代码,我们仅需放入相应的事件绑定代码即可),取终代码结构如下( MoveScene.js):
Silverlight_JsWeb.MoveScene
=
function
()
{
}
Silverlight_JsWeb.MoveScene.prototype
{
handleLoad: (plugIn, userContext, rootElement)
{
this .plugIn plugIn;
// 按钮事件挂钩示例: 查找按钮,然后附加事件处理程序 var MouseEllipse rootElement.findName( " MouseEllipse );
MouseEllipse.addEventListener( MouseMove , Silverlight.createDelegate( .handleMouseMove));
MouseEllipse.addEventListener( MouseLeave .handleMouseLeave));
MouseEllipse.addEventListener( MouseLeftButtonUp .handleMouseLeftButtonUp));
},
鼠标移入处理程序 handleMouseMove: (sender, mouseEventArgs)
{
sender.Fill Coral ;
currX mouseEventArgs.getPosition( null ).x;
currY ).y;
Status sender.findName( Status );
Status.Text x: + y: currY;
},
鼠标离开处理程序 handleMouseLeave: teal ;
},0);"> 鼠标左键单击处理程序 handleMouseLeftButtonUp: Blue ;
alert( mouseEventArgs.getPosition( ).x
).y);
}
}
{
}
Silverlight_JsWeb.MoveScene.prototype
{
handleLoad: (plugIn, userContext, rootElement)
{
this .plugIn plugIn;
// 按钮事件挂钩示例: 查找按钮,然后附加事件处理程序 var MouseEllipse rootElement.findName( " MouseEllipse );
MouseEllipse.addEventListener( MouseMove , Silverlight.createDelegate( .handleMouseMove));
MouseEllipse.addEventListener( MouseLeave .handleMouseLeave));
MouseEllipse.addEventListener( MouseLeftButtonUp .handleMouseLeftButtonUp));
},
鼠标移入处理程序 handleMouseMove: (sender, mouseEventArgs)
{
sender.Fill Coral ;
currX mouseEventArgs.getPosition( null ).x;
currY ).y;
Status sender.findName( Status );
Status.Text x: + y: currY;
},
鼠标离开处理程序 handleMouseLeave: teal ;
},0);"> 鼠标左键单击处理程序 handleMouseLeftButtonUp: Blue ;
alert( mouseEventArgs.getPosition( ).x
).y);
}
}
object.AddEventListener(eventName, functionReference)
其参数:
eventName表示事件的名称,string类型(如KeyDown等)。
functionReference ,表示事件处理方法的引用,Object类型(通常采用Silverlight.createDelegate方法创建)。
eventName表示事件的名称,string类型(如KeyDown等)。
functionReference ,表示事件处理方法的引用,Object类型(通常采用Silverlight.createDelegate方法创建)。
MouseEllipse.addEventListener(
.handleMouseMove));
retval
object.FindName(name)
通过该方法我们就可以该XMAL中的元素了。
目前我们只是完成了相应的代码声明工作。仅下面就是创建该silverlight对象的代码(因为要演示三种鼠标应用场景,所以这里采用了参数化的方式来简化代码, 文件 CreateSilverlight.js):
目前我们只是完成了相应的代码声明工作。仅下面就是创建该silverlight对象的代码(因为要演示三种鼠标应用场景,所以这里采用了参数化的方式来简化代码, 文件 CreateSilverlight.js):
Instance:实例名称
// Source:资源文件名称 ParentElement:相应的父元素名称 PluginID: 插件名称 createSilverlight(Instance, Source, ParentElement, PluginID)
{
scene Instance;
Silverlight.createObjectEx({
source: Source,
parentElement: ParentElement,
id: PluginID,
properties: {
width: ' 300 version: 2.0 windowless: true aliceblue 24
},
events: {
注意此处的代码使用方式,它将相应的prototype实例和相应方法 绑定到onLoad事件上 onLoad: Silverlight.createDelegate(scene, scene.handleLoad),
onError: errorDiv document.getElementById( errorLocation );
if (errorDiv != ) {
errorText args.errorType - args.errorMessage;
(args.ErrorType == ParserError ) {
errorText += <br>File: args.xamlFile;
errorText args.lineNumber;
errorText character args.charPosition;
}
else RuntimeError <br>line args.charPosition;
}
errorDiv.innerHTML errorText;
}
}
},
initParams: 初始化参数 context:
});
}
// Source:资源文件名称 ParentElement:相应的父元素名称 PluginID: 插件名称 createSilverlight(Instance, Source, ParentElement, PluginID)
{
scene Instance;
Silverlight.createObjectEx({
source: Source,
parentElement: ParentElement,
id: PluginID,
properties: {
width: ' 300 version: 2.0 windowless: true aliceblue 24
},
events: {
注意此处的代码使用方式,它将相应的prototype实例和相应方法 绑定到onLoad事件上 onLoad: Silverlight.createDelegate(scene, scene.handleLoad),
onError: errorDiv document.getElementById( errorLocation );
if (errorDiv != ) {
errorText args.errorType - args.errorMessage;
(args.ErrorType == ParserError ) {
errorText += <br>File: args.xamlFile;
errorText args.lineNumber;
errorText character args.charPosition;
}
else RuntimeError <br>line args.charPosition;
}
errorDiv.innerHTML errorText;
}
}
},
initParams: 初始化参数 context:
});
}
createSilverlight(
new
Silverlight_JsWeb.MoveScene(),
xaml/MoveScene.xaml SilverlightControlHost_Move ),0);">);
xaml/MoveScene.xaml SilverlightControlHost_Move ),0);">);
通过使用全局变量来记录鼠标的位置和是否停止拖动等信息
当前是否设置鼠标捕获
isMouseCaptured;
全局位置变量 mouseVerticalPosition;
mouseHorizontalPosition;
Silverlight_JsWeb.DragDrop ()
{
}
Silverlight_JsWeb.DragDrop.prototype DragRec DragRec );
DragRec.addEventListener( MouseLeftButtonDown .handleMouseLeftButtonDown));
DragRec.addEventListener( .handleMouseMove));
DragRec.addEventListener( handleMouseLeftButtonDown: 获取当前鼠标左键按下的位置 mouseVerticalPosition ).y;
mouseHorizontalPosition ).x;
isMouseCaptured true ;
sender.CaptureMouse();
},0);"> handleMouseMove: item sender;
(isMouseCaptured)
{
计算当前对象的位置. deltaV ).y - mouseVerticalPosition;
deltaH mouseHorizontalPosition;
newTop item[ Canvas.Top ];
newLeft Canvas.Left ];
对鼠标选中的元素设置新的移动位置. item[ ] newTop;
item[ newLeft;
更新全局位置变量. mouseVerticalPosition ).y;
mouseHorizontalPosition ).x;
}
},
鼠标左键松开处理程序 false ;
sender.ReleaseMouseCapture();
mouseVerticalPosition 1 ;
mouseHorizontalPosition ;
}
}
全局位置变量 mouseVerticalPosition;
mouseHorizontalPosition;
Silverlight_JsWeb.DragDrop ()
{
}
Silverlight_JsWeb.DragDrop.prototype DragRec DragRec );
DragRec.addEventListener( MouseLeftButtonDown .handleMouseLeftButtonDown));
DragRec.addEventListener( .handleMouseMove));
DragRec.addEventListener( handleMouseLeftButtonDown: 获取当前鼠标左键按下的位置 mouseVerticalPosition ).y;
mouseHorizontalPosition ).x;
isMouseCaptured true ;
sender.CaptureMouse();
},0);"> handleMouseMove: item sender;
(isMouseCaptured)
{
计算当前对象的位置. deltaV ).y - mouseVerticalPosition;
deltaH mouseHorizontalPosition;
newTop item[ Canvas.Top ];
newLeft Canvas.Left ];
对鼠标选中的元素设置新的移动位置. item[ ] newTop;
item[ newLeft;
更新全局位置变量. mouseVerticalPosition ).y;
mouseHorizontalPosition ).x;
}
},
鼠标左键松开处理程序 false ;
sender.ReleaseMouseCapture();
mouseVerticalPosition 1 ;
mouseHorizontalPosition ;
}
}
object.CaptureMouse()
该方法的调用者object即是支持被拖动的元素,当元素对象支持拖动时,该方法调用返回true
与上面方法相对应的是 object. ReleaseMouseCapture(), 它会放弃对当前元素的鼠标捕获操作。
其最终的运行结果如下:
前两个DEMO是对鼠标基本事件的操作。下面将会演示一下UIElement的Bubble问题。写过IE脚本的朋友应该都会知道这个元素冒泡的问题这个问题有时我们希望发生的,有时即是我们不希望看到了。在XMAL中,先声明元素在整个Canvas的最下面,而后声明的元素在最上面。这样当我们将鼠标从上面的元素移入到下面的元素时,就会出现下图中所显示的结果(注意在两个元素交叉区域时下方所显示的元素名称):
与上面方法相对应的是 object. ReleaseMouseCapture(), 它会放弃对当前元素的鼠标捕获操作。
其最终的运行结果如下:
前两个DEMO是对鼠标基本事件的操作。下面将会演示一下UIElement的Bubble问题。写过IE脚本的朋友应该都会知道这个元素冒泡的问题这个问题有时我们希望发生的,有时即是我们不希望看到了。在XMAL中,先声明元素在整个Canvas的最下面,而后声明的元素在最上面。这样当我们将鼠标从上面的元素移入到下面的元素时,就会出现下图中所显示的结果(注意在两个元素交叉区域时下方所显示的元素名称):
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。