【问题标题】:Drag and drop not working拖放不起作用
【发布时间】:2011-03-23 23:46:17
【问题描述】:

我有一个使用 WCF 创建的上传/下载 Web 服务。我使用 c sharp 作为语言。

我在我的文本框上启用了允许拖放,该文本框接受要拖入其中的项目,但它不允许我这样做,我仍然没有悬停在它上面的迹象。

有什么我缺少的吗? 仅供参考,我使用完全相同的代码制作了另一个程序,并且可以毫无问题地拖放项目。

    private void FileTextBox_DragEnter(object sender, DragEventArgs e)
    {
        //Makes sure that the user is dropping a file, not text
        if (e.Data.GetDataPresent(DataFormats.FileDrop, false) == true)
            //Allows them to continue
            e.Effect = DragDropEffects.Copy;
        else
            e.Effect = DragDropEffects.None;
    }





    private void FileTextBox_DragDrop(object sender, DragEventArgs e)
    {
        String[] files = (String[])e.Data.GetData(DataFormats.FileDrop);

        foreach (string file in files)
        {
            FileTextBox.Text = file.ToString();
        }
    } 

【问题讨论】:

  • TextBox 不是通过循环添加的合适控件。获取第一个文件或使用列表控件。
  • 我认为你的意思是 WPF 而不是 WCF。

标签: c# .net wcf


【解决方案1】:

这些不是您需要的唯一代码。你需要:

FileTextBox.AllowDrop = true;
FileTextBox.DragEnter += new DragEventHandler (FileTextBox_DragEnter);
FileTextBox.DragDrop += new DragEventHandler (FileTextBox_DragDrop);

当然,如果您使用的是 IDE,您可以通过在表单设计器中分配处理程序来实现这一点。

【讨论】:

  • 我应该把这个放在哪里?
  • Load处理函数中,例如:Form1_Load
  • 你能在FileTextBox.DragEnter += new DragEventHandler (FileTextBox_DragEnter); 处放置一个断点并在调试模式下运行吗?查看调试器是否在该行停止。
  • 是的,调试器在该行停止,但方法/事件本身没有被调用。
  • @Ravana,FileTextBox.AllowDrop = true; 有帮助吗?
【解决方案2】:

“正常”DragEnterDragOverDrop、...事件不适用于 TextBox!请改用PreviewDragEnterPreviewDragOverPreviewDrop

还要确保在 PreviewDragOver 和/或 PreviewDragEnter 委托中设置了 DragDropEffects

小例子:将文件夹拖放到文本框

XAML 部分:

             <TextBox
                Text=""
                Margin="12"
                Name="textBox1"
                AllowDrop="True"
                PreviewDragOver="textBox1_DragOver"
                PreviewDragEnter="textBox1_DragOver"
                PreviewDrop="textBox1_Drop"/> 

代码隐藏部分:

    private void textBox1_DragOver(object sender, DragEventArgs e)
    {
        if(e.Data.GetDataPresent(DataFormats.FileDrop, true))
        {
            string[] filenames = e.Data.GetData(DataFormats.FileDrop, true) as string[];

            if(filenames.Count() > 1 || !System.IO.Directory.Exists(filenames.First()))
            {
                e.Effects = DragDropEffects.None;
                e.Handled = true;
            }
            else
            {
                e.Handled = true;
                e.Effects = DragDropEffects.Move;
            }
        }
    }

    private void textBox1_Drop(object sender, DragEventArgs e)
    {
        var buffer = e.Data.GetData(DataFormats.FileDrop, false) as string[];
        textBox1.Text = buffer.First();
    }

【讨论】:

    猜你喜欢
    • 2016-07-10
    • 2015-08-10
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多