Silverlight的拖放API
介绍
拖放共同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="windowless" 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信息序列。
在这里你可以找到完整的源。
反馈
虽然我们很高兴添加拖放到Silverlight,我们知道有很多完成/改善,我们发布的仅仅是一个测试。 一如既往,非常感谢您的反馈,将作为一个重要的数据点用来帮助我们优先考虑的工作。 谢谢!
Technorati的标签: Silverlight中 , 拖放











我试图找到一个解决方案,拖放从Outlook到Silverlight应用程序。
您的插件这样做吗? 我试图运行你的源,但它似乎并没有现在处理这一权利。
有什么建议?
谢谢
我如何获得DragDropTarget工作只有一条路呢?
我不希望的项目要拖回落到他们那里起源
_AT_大卫Leisner
嗨大卫,
是的,行为是几乎在SL4的RTM相同:用户将看到插件的水平,即在标准光标的变化,如果有一个控制,AllDrop设置为true,将显示整个插件允许光标下降;但它是无法控制具体的,是不能自定义,即光标不会改变,AllDrop设置为false的控制,有没有DragDropEffects设置在DragEventArgs。 我们可能会在将来的版本中实现更多的DND功能。
谢谢,
宁
谢谢你这个非常有用的,易于实现的功能!
问:您在您的原创文章说,在Silverlight 4版“有没有拖动的对象或DragDropEffects视觉。”
这也就是在最后的Silverlight 4中释放的情况下?
当从Windows资源管理器中拖动图像到Silverlight的ListBox中,这将是非常有用的自定义光标的外观,也有不同风格的光标根据目标元素是否具有的AllowDrop启用或不。
谢谢!
您好,感谢你的示例代码。
嗨,
它可以防止从开始拖放动作DataGridDragDropTarget?
我whant DragSource和另一只为DropTarget的是使用一个DataGrid。 和DropTarget的只DataGrid中不应显示这个“StartDragShadow”时,按以上的项目,移动鼠标。
谢谢!
史蒂芬
@鲁迪
我也想know.thank你!
问候
Silverlight的
@鲁迪
请看到我的其他回复。 Silverlight工具包已经有的ListBoxDragDropTarget ,所以你可以从ListBox拖动。 你需要实现自己的帆布拖放目标容器,现在。
@国标
眼下只有SL4的运行时支持文件拖放目标SL插件,只公开拖放目标属性(AllDrop)和事件(的DragEnter /移动/离开,下降),但不能拖动源事件(GiveFeedback,QueryContinueDrag)。 这是不能完全通过IDataObject的扩展。 如果你不能等待,你最好的机会,现在是看实施工具包,它允许从DataGrid SL插件内的阻力和下降。 代码是DataGridDragDropTarget.cs下源\ Controls.Data.Toolkit项目。 谢谢。
您好,我想知道如何实现拖放在DataGrid中?
我想知道,如果有任何的方式来实现从列表框拖放对象(图标)以帆布?
问候
鲁迪
_AT_布莱斯Prunier
是的。 贾法尔已实施几乎完全兼容的WPF,拖放功能,Silverlight 3和Silverlight 4。 据运Silverlight工具包的一部分。 我强烈建议检查出他的博客文章获得更多信息。
请注意两者之间的拖放实现的关键差异:实施工具包的版本在运行时之上,所以它需要* DragDropTarget容器,只适用在Silverlight插件控制元素之间。 Toolkit实现利用运行拖放API时,像Silverlight 4中的工具包,它可以Microsoft.Windows.DragDrop.AllowDrop使用UIElement.AllowDrop财产。 运行公开,而所有的UIElement拖放目标事件,则Toolkit实现已经处理这些事件的DataGrid,ListBox和TreeView的重要控制,所以它是很容易使用。 我们已经取得了一定尽可能兼容的API,使人们可以使用这两个现在一起,并迁移到运行实施比较容易,运行公开更多的拖放功能。 这也是Silverlight工具包的一般方法, Silverlight控件,我呼吁在先前的帖子。
SL4的工具包(System.Windows.Controls.Toolkit)提供了更高水平的DragDrop实现内部Silverligth拖放。
并非所有的案件目前由SL 4工具包支持,但你,可以easely创建自己的抽象类DragDropTarget的。
问候