存档

2009年11月存档,

Silverlight的拖放API

2009年11月28日, 13个评论

简介

拖放是一种常见的的UX范式和最要求的功能。 在Silverlight 4 Beta中,我们推出了一套基本的API,使拖动图片文件拖放到Silverlight应用程序的最常见的情况,我们设计的API,让我们没有API改变公开更多的阻力和下降功能在路上希望。

空气污染指数

下面是新的API的核心:

 命名空间 System.Windows 
{
公共抽象类的UIElement:DependencyObject的
{
/ /字段
公共静态只读的DependencyProperty AllowDropProperty;

/ /活动
公共事件 DragEventHandler的DragEnter;
公共事件 DragEventHandler DragLeave;
公共事件 DragEventHandler的DragOver;
公共事件 DragEventHandler下降;

/ /属性
公共BOOL的AllowDrop {;}
}

sender, DragEventArgs e); 公共委托无效 DragEventHandler( 对象发件人,发送DragEventArgs);

公共密封类 DragEventArgs:RoutedEventArgs
{
/ /方法
公共点GetPosition(UIElement的relativeTo);

/ /属性
公共 IDataObject的数据{[SecuritySafeCritical];}
公共BOOL处理;设置;}
}
}

命名空间 System.Windows.Controls
{
公共抽象类控制:FrameworkElement的
{
受保护的虚拟无效 OnDragEnter(DragEventArgs E);
受保护的虚拟无效 OnDragLeave(DragEventArgs E);
受保护的虚拟无效的OnDragOver(DragEventArgs E) ;
受保护的虚拟无效的OnDrop(DragEventArgs E) ;
}
}

  • 的AllowDrop:这是相依性属性,指示元素是否是一个拖放目标。
  • 的DragEnter,DragLeave的DragOver及掉落:这些路由事件。 他们泡沫,消防的AllowDrop设置为true的元素。
  • OnDragEnter,OnDragLeave,OnDragOver OnDrop:这些都是保护子类重写虚函数。
  • DragEventArgs:这个类允许拖放目标的事件处理程序或方法覆盖来访问被拖动或删除数据。

使用

使用Silverlight的拖放API主要有两种方式:

  • Silverlight应用程序可以处理那些放置目标事件过程中下降的事件处理程序中的文件。
  • Silverlight控件可以覆盖那些放置目标的虚函数来处理拖放的数据,使自己成为放置目标。

限制

拖放功能在Silverlight 4 Beta的推出不仅使最常见的场景:作为一个文件拖放目标的Silverlight插件。 请注意与当前实施下列限制:

  • 有没有降源支持(QueryContinueDrag GiveFeedback)。
  • 有没有DragDropEffects或DragEventArgs DragDropKeyStates。
  • 没有拖动的对象或DragDropEffects视觉。
  • 只有文件拖放支持:
    • 所有下降目标事件,火灾只拖放文件时。
    • IDataObject的DataObject和DragEventArgs.Data支持只有一种格式:“FileDrop”,和数据类型的FileInfo []。
  • 大部分IDataObject方法抛出NotImplementedException。
  • 必须是窗口拖放到工作在Windows,Silverlight插件。 换句话说,如果指定<param name="win​​dowless" value="true"/>,拖放事件不会火。
  • 由于Silverlight插件在Mac上始终没有窗户的,你需要挂钩JavaScript的拖放事件引发的Silverlight拖放事件。 换句话说,如果你想您的Silverlight应用程序的支持文件在Mac下降以及Windows,您将需要添加下面的脚本和Silverlight插件属性托管的HTML或ASPX页面:
     <! - 头标记年底前添加下面的脚本 - > 
    <script type= "text/javascript">
    功能 handleDragEnter(oEvent){
    / /阻止默认操作
    oEvent.preventDefault();

    标志= silverlightControl.dragEnter(oEvent);

    / /如果我们成功地处理它,然后停止事件的传播
    如果 (旗)
    oEvent.stopPropagation();
    }

    功能 handleDragLeave(oEvent){
    / /阻止默认操作
    oEvent.preventDefault();

    标志= silverlightControl.dragLeave(oEvent);

    / /如果我们成功地处理它,然后停止事件的传播
    如果 (旗)
    oEvent.stopPropagation();
    }

    功能 handleDragOver(oEvent){
    / /阻止默认操作
    oEvent.preventDefault();

    标志= silverlightControl.dragOver(oEvent);

    / /如果我们成功地处理它,然后停止事件的传播
    如果 (旗)
    oEvent.stopPropagation();
    }

    功能 handleDropEvent(oEvent){

    / /阻止默认操作
    oEvent.preventDefault();

    标志= silverlightControl.dragDrop(oEvent);

    / /如果我们成功地处理它,然后停止事件的传播
    如果 (旗)
    oEvent.stopPropagation();
    }
    </ SCRIPT>
    <! - 使用JavaScript拖放目标的事件来触发Silverlight的下降目标事件 - >

    ondragover= "handleDragOver(event)" ID =“silverlightControl”ondragenter =“handleDragEnter(事件)”ondragover =“handleDragOver(事件)”
    > ondragleave =“handleDragLeave(事件)”ondrop =“handleDropEvent(事件)”>

  • DragEventArgs.Data是只有在drop事件。 访问中的DragEnter的DragOver和DragLeave DragEventArgs.Data可能会导致SecurityException 和访问目录,目录名或真实姓名从DragEventArgs.Data FileInfo对象的属性可能会导致ArgumentNullException。

    演示程序

    下面是一个演示应用程序:

  • 左上角的嵌套网格使用拖放目标的事件处理程序显示DragEventArgs信息。
  • 右上角的嵌套网格包含ImageDropTarget用户控制,它覆盖了OnDrop方法来呈现下降的文件,如果它是一个图像。
  • 底部的列表框显示的下降目标的事件,其向上冒泡,DragEventArgs信息序列。

    Click to run DragDropDemo if you have Silverlight 4 Beta installed.

    在这里你可以找到完整的源代码。

    反馈

    虽然我们很高兴能添加拖放到Silverlight,我们知道还有很多完成/完善,我们发布的只是一个测试版。 一如往常,您的反馈意见表示高度赞赏,将作为一个重要的数据点用来帮助我们优先考虑的工作。 谢谢!

    标签: