Silverlight中鼠标事件的js开发

Silverlight中鼠标事件的js开发,第1张

概述     在silverlight 中,我们可以通过js事件绑定方法addEventListener,往xaml文件中的UIElement元素上绑定事件js事件,也可以通过直接属性赋值的方法来将事件绑定到UIElement元素上,比如下面的语法声明:    < Rectangle  x:Name =""  MouseEnter ="onMouseEnter"    />      本人比较喜欢前者      在silverlight 中,我们可以通过Js事件绑定方法addEventListener,往xaml文件中的UIElement元素上绑定事件Js事件,也可以通过直接属性赋值的方法来将事件绑定到UIElement元素上,比如下面的语法声明:    < Rectangle  x:name ="

"
 MouseEnter ="onMouseEnter"  

 
/>      本人比较喜欢前者的定义方法,主要是因为其灵活性和支持prototype式的代码结构。下面就通过一个获取鼠标当前坐标位置的例子,来说明一下如果使用Js事件绑定。      首先我们需要定义一个Silverlight Jscript 文件,并将其命名为MoveScene.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
    上面代码中定义了两个元素:
     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 该方法用于向指定的元素绑定相应的方法。其函数声明如下:   object.AddEventListener(eventname, functionReference)
    其参数:
    eventname表示事件的名称,string类型(如KeyDown等)。
    functionReference ,表示事件处理方法的引用,Object类型(通常采用Silverlight.createDelegate方法创建)。
    该方法的使用已如上面代码所声明的那样:     MouseEllipse.addEventListener( .handleMouseMove));
    这样我们就将 handleMouseMove方法绑定到了MouseEllipse元素的 MouseMove事件上。
   
    另外一个要介绍的方法是Findname,其函数声明如下:     retval   object.Findname(name)
    
    其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):   
通过使用全局变量来记录鼠标的位置和是否停止拖动等信息 当前是否设置鼠标捕获  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 
;
    }

}

    上面代码中有两个方法要说明一下:          object.CaptureMouse()    
    该方法的调用者object即是支持被拖动的元素,当元素对象支持拖动时,该方法调用返回true   
  
    与上面方法相对应的是 object. ReleaseMouseCapture(), 它会放弃对当前元素的鼠标捕获 *** 作。
   
    其最终的运行结果如下:

           


    
       
     前两个DEMO是对鼠标基本事件的 *** 作。下面将会演示一下UIElement的Bubble问题。写过IE脚本的朋友应该都会知道这个元素冒泡的问题这个问题有时我们希望发生的,有时即是我们不希望看到了。在XMAL中,先声明元素在整个Canvas的最下面,而后声明的元素在最上面。这样当我们将鼠标从上面的元素移入到下面的元素时,就会出现下图中所显示的结果(注意在两个元素交叉区域时下方所显示的元素名称):

          


    因为rect2是在rect1之后声明的,所以在交叉区域显示的是rect2。当然我们可以通过在相应元素中设置Canvas.ZIndex 属性来改变这里顺序,如下所示:    Rectangle
    
="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开发所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1055054.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存