存档

帖子标记'拖放'

Silverlight的拖放API

11月28日,2009年 13个评论

介绍

拖放共同UX范式和最要求的功能。 在Silverlight 4测试版,我们推出了一套基本的API,使拖动图片文件拖放到Silverlight应用程序中最常见的场景,和我们设计的API,让我们暴露在道路上的阻力和下降功能更多,没有API改变,希望。

空气污染指数

以下为核心的新的API:

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

/ /活动
公共事件 DragEventHandler的的DragEnter;
公共的事件 DragEventHandler DragLeave;
公共事件 DragEventHandler的的DragOver;
公共事件 DragEventHandler掉落;

/ /属性
公共布尔的AllowDrop {;}
}

sender, DragEventArgs e); 公众委托无效 DragEventHandler的( 对象发件人,DragEventArgs E);

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

/ /属性
公共 IDataObject的数据{[SecuritySafeCritical];}
公共布尔处理;;}
}
}

命名空间 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版附带的拖放功能不仅使最常见的场景:作为一个文件拖放目标Silverlight插件。 目前的执行情况,请注意以下限制:

  • 有没有降源支持(QueryContinueDrag GiveFeedback)。
  • 有没有DragDropEffects或DragEventArgs DragDropKeyStates。
  • 有没有可视化拖动的对象或DragDropEffects。
  • 唯一的文件拖放支持:
    • 所有下降目标的事件触发只有当文件正在拖放。
    • IDataObject的DataObject和DragEventArgs.Data的只支持一种格式:“FileDrop”,数据类型为FileInfo []。
  • IDataObject方法抛出NotImplementedException。
  • Silverlight插件拖放到工作在Windows,必须开窗。 换句话说,如果<param name="win​​dowless" value="true"/>指定,拖放事件将不会开火。
  • 由于Silverlight插件在Mac上始终是没有窗户的,你需要挂钩JavaScript的拖放事件引发的Silverlight拖放事件。 换句话说,如果你想你的Silverlight应用程序的支持文件以及Windows在Mac上下降,你将需要添加下面的脚本和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,我们知道有很多完成/改善,我们发布的仅仅是一个测试。 一如既往,非常感谢您的反馈,将作为一个重要的数据点用来帮助我们优先考虑的工作。 谢谢!

    Technorati的标签: