C# 实现托拉拽获取数据

在C#中要想实现此功能,大致流程如下:

  1. 数据获取,利用事件触发获取数据。
  2. 复制数据,确认数据的复制方式,并对复制的数据格式和应用程序做兼容性确认。
  3. 读取数据,根据需求,将数据显示在对应位置。

数据获取主要通过事件DragEventArgs来触发,DragEventArgs类主要为 DragDropDragEnterDragOver 事件提供数据。

复制数据包括确认数据的复制方式和数据格式。复制方式包括复制、移动、复制数据链接等,主要通过DragDropEffects 枚举实现。其中复制的数据保存在DragEventArgs.Data中。数据格式确认其实就是对DragEventArgs.Data中的数据进行确认,这里会用到DataObject.GetData 方法和DataFormats 类的操作。

读取数据主要是将复制的数据保存到指定的数据格式中,比如列表或自定义数据格式。

DragEventArgs

官方文档链接如下:DragEventArgs 类 (System.Windows.Forms) | Microsoft Learn

DragEventArgs主要包括三个事件:DragDropDragEnterDragOver

DragDrop当用户通过将对象拖动到控件上,然后通过松开鼠标按钮将其拖放到控件上来完成拖放操作时,将发生该事件。

DragEnter当用户使用鼠标拖动对象时将鼠标指针移动到控件上时,将发生该事件。

DragOver当用户使用鼠标拖动对象时,将鼠标指针移到控件上时,将发生该事件。

DragDropEffects

指定拖放操作的可能效果。其实就是数据的复制方式。属于枚举类型

All-2147483645Copy、Move和 Scroll效果的组合。
Copy1将拖动源中的数据复制到放置目标。
Link4将拖动源中的数据链接到放置目标。
Move2将拖动源的数据移动到放置目标。
None0放置目标不接受该数据。
Scroll-2147483648拖动时可以滚动目标,以定位在目标中当前不可见的某个放置位置。

DataObject.GetData

返回与所指定数据格式关联的数据

public virtual object? GetData (string format, bool autoConvert);
参数数据类型描述
formatstring要检索的数据的格式
autoConvertbool如果要将数据转换成指定的格式,则为 true;否则为 false。
ObjectObject返回与指定格式相关联的数据,否则为null

DataFormats

提供 static 预定义的 Clipboard 格式名称。 使用它们来标识存储在 IDataObject 中的数据的格式。

字段

属性描述
Bitmap指定 Windows 位图格式。 此 static 字段是只读的。
CommaSeparatedValue指定以逗号分隔值 (CSV) 的格式,这是电子表格常用的交换格式。 Windows 窗体不直接使用此格式。 此 static 字段是只读的。
Dib指定 Windows 与设备无关的位图 (DIB) 格式。 此 static 字段是只读的。
Dif指定 Windows 数据交换格式 (DIF),Windows 窗体不直接使用此格式。 此 static 字段是只读的。
EnhancedMetafile指定 Windows 增强型图元文件格式。 此 static 字段是只读的。
FileDrop指定 Windows 文件放置格式,Windows 窗体不直接使用此格式。 此 static 字段是只读的。文件格式为object,其实就是从资源管理器中拖放过来的文件系统对象(就是文件夹或文件)
Html指定 HTML 剪贴板格式中的文本。 此 static 字段是只读的。
Locale指定 Windows 区域性格式,Windows 窗体不直接使用此格式。 此 static 字段是只读的。
MetafilePict指定 Windows 图元文件格式,Windows 窗体不直接使用此格式。 此 static 字段是只读的。
OemText指定标准 Windows 原始设备制造商 (OEM) 文本格式。 此 static 字段是只读的。
Palette指定 Windows 调色板格式。 此 static 字段是只读的。
PenData指定 Windows 钢笔数据格式,它由书写软件所使用的笔画组成,Windows 窗体不使用此格式。 此 static 字段是只读的。
Riff指定资源交换文件格式 (RIFF) 音频格式,Windows 窗体不直接使用此格式。 此 static 字段是只读的。
Rtf指定由 RTF 数据组成的文本。 此 static 字段是只读的。
Serializable指定封装任何类型的 Windows 窗体对象的格式。 此 static 字段是只读的。
StringFormat指定 Windows 窗体字符串类格式,Windows 窗体使用此格式存储字符串对象。 此 static 字段是只读的。
SymbolicLink指定 Windows 符号链接格式,Windows 窗体不直接使用此格式。 此 static 字段是只读的。
Text指定标准 ANSI 文本格式。 此 static 字段是只读的。
Tiff指定标记图像文件格式 (TIFF),Windows 窗体不直接使用此格式。 此 static 字段是只读的。
UnicodeText指定标准 Windows Unicode 文本格式。 此 static 字段是只读的。
WaveAudio指定 wave 音频格式,Windows 窗体不直接使用此格式。 此 static 字段是只读的。

方法

方法描述
GetFormat(Int32)为指定的 ID 返回带有 Windows 剪贴板数字 ID 和名称的 DataFormats.Format。
GetFormat(String)为指定的格式返回带有 Windows 剪贴板数字 ID 和名称的 DataFormats.Format。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace demo196_dataformats
{
    class Program
    {
        static void Main(string[] args)
        {
            DataFormats.Format myFormat01 = DataFormats.GetFormat(13);
            DataFormats.Format myFormat02 = DataFormats.GetFormat(DataFormats.UnicodeText);

            Console.WriteLine("ID value:" + myFormat02.Id + "\n" + "Format name:" + myFormat02.Name);

            Console.WriteLine("The Format Name corressponding to the ID" + myFormat01.Id + "is:");
            Console.WriteLine(myFormat01.Name);
            Console.ReadKey();
        }
    }
}
  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现 WPF 中的可拉控件生成,可以使用拖放操作。以下是一个基本的示例: 首先,在 XAML 中设置一个源控件,允许它被拖动。例如,你可以使用一个 Button 控件,并在 MouseDown 事件处理程序中启动一个拖动操作: ``` <Button Content="Drag Me" MouseDown="Button_MouseDown"/> ``` 在 MouseDown 事件处理程序中,可以使用 DragDrop.DoDragDrop 方法启动拖放操作。此方法需要三个参数:源控件、要传递的数据和拖动操作的类型。例如: ``` private void Button_MouseDown(object sender, MouseButtonEventArgs e) { DragDrop.DoDragDrop((Button)sender, "Some data to drag", DragDropEffects.Copy); } ``` 接下来,在 XAML 中设置一个接收控件,允许它接收拖放的数据。例如,你可以使用一个 StackPanel 控件,并在 Drop 事件处理程序中处理拖放操作: ``` <StackPanel Drop="StackPanel_Drop"/> ``` 在 Drop 事件处理程序中,可以使用 e.Data.GetData 方法获取传递的数据,并创建一个新控件以显示该数据。例如: ``` private void StackPanel_Drop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.StringFormat)) { string data = (string)e.Data.GetData(DataFormats.StringFormat); Button newButton = new Button() { Content = data }; ((StackPanel)sender).Children.Add(newButton); } } ``` 这将在 StackPanel 中添加一个新的 Button 控件,其中包含拖放操作中传递的数据。你可以根据需要自定义此过程,例如,可以使用其他控件作为源控件,将更多数据传递给接收控件等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yue008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值