WPF中控件拖放(一)

拖放通常指一种数据传输的方法:使用鼠标(或类似其他设备)选择一个或多个对象,将其拖至用户界面(UI)中的目标位置

 1.拖放操作通常涉及两个参与方

  *拖动对象、拖放目标

  *拖动对象和拖放目标可能是相同应用程序或不同应用程序中的UI元素

        *在 Internet 区域中 OLE 拖放无效

  *拖放属于广义的数据传输

  *在拖放操作中,DataObject 用于存储数据。 从概念上讲,数据对象由一对或多对包含实际数据的 Object 和对应的数据格式标识符组成。

拖动源通过调用静态 DragDrop.DoDragDrop 方法和向其传递传输的数据来启动拖放操作。 如有必要,DoDragDrop 方法将使 DataObject 中的数据自动换行。 为了更好地控制数据格式,可将 DataObject 中的数据换行,然后再将其传递至 DoDragDrop 方法。 拖放目标负责从 DataObject 中提取数据。 有关使用数据对象的详细信息,请参阅数据和数据对象

  *拖放操作的源和目标均为 UI 元素

2.拖放效果  

  拖放操作对传输的数据可具有不同的效果。 例如,可以复制数据,或者可以移动数据。 WPF 定义可用于指定拖放操作效果的 DragDropEffects 枚举。 在拖动源中,可以指定源在 DoDragDrop 方法中允许的效果。 在拖放目标中,可以指定目标在 Effects 类的 DragEventArgs 属性的中预期的效果。 当拖放目标指定其在 DragOver 事件中的预期效果时,该信息将被传递回 GiveFeedback 事件中的拖动源。 拖动源则使用此信息通知用户拖放目标想要对数据产生的效果。 放置数据时,拖放目标指定其在 Drop 事件中的实际效果。 该信息会作为 DoDragDrop 方法的返回值传递回拖动源。 如果拖放目标返回并不在 allowedEffects 拖动源列表中的效果,那么将取消拖放操作,且不会进行任何数据传输。

请务必记住,在 WPF 中,DragDropEffects 值仅用于提供有关拖放操作效果的拖动源和拖放目标之间的通信。 拖放操作的实际效果取决于你在应用程序中编写的相应代码。

  例如,拖放目标可以指定在其中放置数据的效果是移动数据。 然而,若要移动数据,必须将数据添加到目标元素并从源元素中删除数据。 源元素可能指示允许移动数据,但是如果没有提供从源元素中删除数据的代码,那么最终结果将为复制但不删除数据。

3.拖放事件

拖动源事件

事件总结
GiveFeedback 此事件在拖放操作期间持续发生,并且使放置源能够向用户提供反馈信息。 通常通过更改鼠标指针外观来指示拖放目标允许的效果这一方式来提供这种反馈。 这是冒泡事件。
QueryContinueDrag 此事件于拖放操作期间键盘或鼠标按钮状态发生变化时发生,并使放置源能够根据键/按钮状态取消拖放操作。 这是冒泡事件。
PreviewGiveFeedback GiveFeedback 的隧道版本。
PreviewQueryContinueDrag QueryContinueDrag 的隧道版本。

拖放目标事件

事件总结
DragEnter 将对象拖到拖放目标的边界中时发生此事件。 这是冒泡事件。
DragLeave 将对象拖出拖放目标边界时发生此事件。 这是冒泡事件。
DragOver 在拖放目标的边界内拖动(移动)对象时会持续发生此事件。 这是冒泡事件。
Drop 将对象放置在拖放目标上时发生此事件。 这是冒泡事件。
PreviewDragEnter DragEnter 的隧道版本。
PreviewDragLeave DragLeave 的隧道版本。
PreviewDragOver DragOver 的隧道版本。
PreviewDrop Drop 的隧道版本。

若要处理对象实例的拖放事件,请为上表中所列的事件添加处理程序。 若要处理类级别的拖放事件,请重写相应的虚拟 On*Event 和 On*PreviewEvent 方法。 有关详细信息,请参阅按控件基类进行的路由事件类处理

 

4.拖放过程

  4.1确定拖动源

    拖动源可以是 UIElement 或 ContentElement

  4.2拖动源上创建事件处理程序

    此事件通常是 MouseMove 事件

  4.3在拖动源事件处理程序中,调用 DoDragDrop 方法启动拖放操作。 在 DoDragDrop 调用中,指定拖动源、要传输的数据和允许的效果

  4.4选择拖放目标

    *拖放目标可以是 UIElement 或 ContentElement

    *在拖放目标上,将 AllowDrop 属性设置为 true

  4.5拖放目标上创建 Drop 事件处理程序以处理放置的数据

    *在 Drop 事件处理程序中,利用 DragEventArgs 和 GetDataPresent 方法提取 GetData 中的数据

    *在 Drop 事件处理程序中,使用数据来执行所需的拖放操作

5.可以通过创建自定义 DataObject 和处理可选拖动源和拖放目标事件来增加拖放实现,如以下任务中所示:

  • 若要传输自定义数据或多个数据项,请创建一个 DataObject以传递至 DoDragDrop 方法。

  • 若要在拖动过程中执行其他操作,请处理拖放目标上的 DragEnterDragOver 和 DragLeave 事件。

  • 若要更改鼠标指针外观,请处理拖动源上的 GiveFeedback 事件。

  • 若要更改取消拖放操作的方式,请处理拖动源上的 QueryContinueDrag 事件。

 

posted @   echo-efun  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示