在Silverlight 4中拖放文件上传?

时间:2010-05-08 12:17:59

标签: silverlight drag-and-drop silverlight-4.0

我正在努力将WinForms应用程序重写为Silverlight。 WinForms应用程序中的一个用例允许用户将Outlook中的TIFF图像(传真)直接拖到WinForms应用程序中的“将图像或传真附加到此案例”控件上。是否有Silverlight 4控件允许相同的功能?重要的是要意识到将文件保存到本地文件系统,然后使用标准上载控件选择和上载文件将无法满足项目中概述的业务要求。

3 个答案:

答案 0 :(得分:2)

Silverlight 4支持将文件从文件系统拖放到任何UIElement。见blog

然而,这是否适用于在Outlook中启动的拖动我不知道。我建议你从这个博客中获取样本并构建一个小测试应用程序,看看你是否可以拖动附件。

当然,您仍然需要将TIFF解码为Silverlight可以使用的位图。

答案 1 :(得分:1)

(我的猜测是Silverlight将成为大部分功能的强大端口,因为它具有“轻量级”特性。您可能需要考虑使用Click-once WPF应用程序而不是Silverlight,特别是因为您已经依赖在丰富的Windows应用程序上安装。)

您需要在Silverlight用户控件的构造函数中执行类似的操作,

this.Drop += new DragEventHandler(MainPage_Drop);

然后添加方法

void MainPage_Drop(object sender, DragEventArgs e)
{
    IDataObject drop = e.Data;

    if (drop.GetDataPresent(System.Windows.DataFormats.FileDrop))
    {
        FileInfo[] files = (FileInfo[])e.Data.GetData(System.Windows.DataFormats.FileDrop);
        foreach (FileInfo file in files)
        {
          // do something with each file here
        }
    }
}

然后 - 看看会发生什么。您需要使用库来添加TIFF支持,这可能类似Stackoverflow上的建议,here

答案 2 :(得分:0)

您可以在Silverlight应用程序中从桌面拖放。我在我们的项目中实现了这一点。检查silverlight项目属性中的“需要提升权限”,并使用silverlight datagrid的drop事件,可以在silverlight数据网格中处理从桌面拖放。

    private void DocumentsDrop(object sender, DragEventArgs e)
    {
        e.Handled = true;

        var point = e.GetPosition(null);
        var dataGridRow = ExtractDataGridRow(point);
        if(dataGridRow !=null)
        {.....
         }

        var droppedItems = e.Data.GetData(DataFormats.FileDrop) as      FileInfo[];
        if (droppedItems != null)
             {
                var droppedDocumentsList = new List<FileInfo>();

                foreach (var droppedItem in droppedItems)
                {
                    if ((droppedItem.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
                    {
                        var directory = new DirectoryInfo(droppedItem.FullName);
                        droppedDocumentsList.AddRange(directory.EnumerateFiles("*", SearchOption.AllDirectories));
                    }
                    else
                    {
                        droppedDocumentsList.Add(droppedItem);
                    }
                }

                if (droppedDocumentsList.Any())
                {
                    ProcessFiles(droppedDocumentsList);
                }
                else
                {
                    DisplayErrorMessage("The selected folder is empty.");
                }
            }
   }

设置AllowDrop = true;在xaml中为datagrid。从DragEventArgs中提取信息为FileInfo Object。