【问题标题】:Implement file dragging to the desktop from a .net winforms application?实现文件从.net winforms 应用程序拖到桌面?
【发布时间】:2010-11-03 18:50:26
【问题描述】:

我有一个文件列表,它们的名称在列表框中,其内容存储在 SQL 表中,我希望我的应用程序的用户能够选择列表框中的一个或多个文件名并将它们拖到桌面,在桌面上生成实际文件。我找不到任何有关如何执行此操作的文档。任何人都可以解释或指出解释吗?

稍后添加: 我已经能够通过处理 DragLeave 事件来完成这项工作。在其中,我在一个临时目录中创建一个文件,该文件具有选定的名称和从 SQL Server 中提取的内容。然后我将文件的路径放入对象中:

var files = new string[1];
files[0] = "full path to temporary file";
var dob = new DataObject();    
dob.SetData(DataFormats.FileDrop, files);
DoDragDrop(dob, DragDropEffects.Copy);

但这似乎非常低效和笨拙,我还没有想出一个很好的方法来摆脱积累的临时文件。

【问题讨论】:

    标签: c# .net drag-and-drop


    【解决方案1】:

    我可以帮助你一些。下面是一些代码,可让您将某些内容拖出列表框,当拖放到桌面上时,它会创建一个存在于您计算机上的文件到桌面的副本。

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.listBox1.Items.Add("foo.txt");
            this.listBox1.MouseDown += new MouseEventHandler(listBox1_MouseDown);
            this.listBox1.DragOver += new DragEventHandler(listBox1_DragOver);
        }
    
        void listBox1_DragOver(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Copy;
        }
    
        void listBox1_MouseDown(object sender, MouseEventArgs e)
        {
            string[] filesToDrag = 
            {
                "c:/foo.txt"
            };
            this.listBox1.DoDragDrop(new DataObject(DataFormats.FileDrop, filesToDrag), DragDropEffects.Copy);
        }
    }
    

    【讨论】:

    • 我明白这一点,但我不明白的是 foo.txt 是在哪里创建并用 SQL 表中的内容填充的。
    • 是否可以添加“c:/foo.txt”,但是当拖动完成后,使用新文件名(如“new foo.txt”)拖放文件?
    【解决方案2】:

    这里有一些样板可以帮助您确定何时开始拖动操作:

    private Rectangle _DragRect;
    
    private void MyDragSource_MouseDown(object sender, MouseEventArgs e) {
       Size dragsize = SystemInformation.DragSize;
       _DragRect = new Rectangle(new Point(e.X - (dragsize.Width / 2), e.Y - (dragsize.Height / 2)), dragsize);
    }
    
    private void MyDragSource_MouseMove(object sender, MouseEventArgs e) {
       if (e.Button == MouseButtons.Left) {
          if (_DragRect != Rectangle.Empty && !_DragRect.Contains(e.X, e.Y)) { 
             // the mouse has moved outside of the drag-rectangle.  Start drag operation
    
             MyDragSource.DoDragDrop(.....)
          }
       }
    }
    
    private void MyDragSource_MouseUp(object sender, MouseEventArgs e) {
       _DragRect = Rectangle.Empty; // reset
    }
    

    【讨论】:

      【解决方案3】:

      我通过扩展 System.Windows.Forms.DataObject
      Transferring Virtual Files to Windows Explorer in C# 找到了更好的解决方案

      还在 StackOverFlow 上找到了一些可能有帮助的线程
      Drag and drop large virtual files from C# to Windows Explorer

      【讨论】:

        猜你喜欢
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多