在silverlight 中,我们可以通过Js事件绑定方法addEventListener,往xaml文件中的UIElement
元素上绑定事件Js事件,也可以通过直接属性赋值的方法来将事件绑定到UIElement元素上,比如下面
的语法声明:
本人比较喜欢前者的定义方法,主要是因为其灵活性和支持prototype式的代码结构。下面就通过
一个获取鼠标当前坐标位置的例子,来说明一下如果使用Js事件绑定。
首先我们需要定义一个Silverlight Jscript 文件,并将其命名为MoveScene.xaml,如下图所示:
这时系统会生成两个文件,一个是同名的MoveScene.xaml,而另一个就是其绑定的Js文件:
MoveScene.Js。我们可以将相应的代码放入这两个文件中,其中xaml代码如下:
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):
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);
}
}
这里面有两个方法需要着重介绍一下:
addEventListener 该方法用于向指定的元素绑定相应的方法。其函数声明如下:
其参数:
eventname表示事件的名称,string类型(如KeyDown等)。
functionReference ,表示事件处理方法的引用,Object类型(通常采用Silverlight.createDelegate方法创建)。
该方法的使用已如上面代码所声明的那样:
MouseEllipse.addEventListener( .handleMouseMove)); 这样我们就将handleMouseMove方法绑定到了MouseEllipse元素的MouseMove事件上。
另外一个要介绍的方法是Findname,其函数声明如下:
其name即是在XAML中元素的名称,它返回该元素的引用(有点像我们经常使用的getElementByID).
通过该方法我们就可以该XMAL中的元素了。
目前我们只是完成了相应的代码声明工作。仅下面就是创建该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 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:
});
}
到这里我们仅需要在htm文件中写入下面的Js代码,便可创建对象了:
createSilverlight( new Silverlight_JsWeb.MoveScene(),xaml/MoveScene.xaml SilverlightControlHost_Move ),0);">);
其运行结果如下图所示:
上面介绍和鼠标MOVE事件的处理方法。下面介绍一下鼠标元素拖动的方法:
其Js声明如下(DragAdnDrop.Js):
全局位置变量 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的最下面,而后声明的元素在最上面。这样当我们将鼠标从上面的元素移入
到下面的元素时,就会出现下图中所显示的结果(注意在两个元素交叉区域时下方所显示的元素名称):
因为rect2是在rect1之后声明的,所以在交叉区域显示的是rect2。当然我们可以通过在相应元素中
设置Canvas.ZIndex 属性来改变这里顺序,如下所示:
="Rect1"
WIDth
Fill ="PowderBlue" Canvas.ZIndex ="3" ="Rect2"
Canvas.top ="50" Canvas.left ="Gold" Opacity ="0.5" ="2" polygon ="polygon1"
Points ="50,200 150,125 200,275 300,200" stroke ="Purple" strokeThickness ="1"
polygon.Fill
SolIDcolorBrush color ="Blue" ="0.4"
polygon
这样我们就可以控件鼠标事件的响应顺序了,如下图。
好了,今天的内容就到这里了。
源码下载,请点击这里:)
以上是内存溢出为你收集整理的Silverlight中鼠标事件的js开发全部内容,希望文章能够帮你解决Silverlight中鼠标事件的js开发所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)