1

我对业务应用程序有以下要求:

(所有这些都可以在本地或服务器上)

  • 允许用户选择文件夹位置
  • 显示文件夹内容
  • 打印文件夹中的选定项目 (*.pdf)
  • 显示已打印的文件
  • 可能将打印的文件移动到新位置(打印的子文件夹)

如何在 Silverlight 中实现这一点?

亲切的问候,

下流的

4

1 回答 1

3

首先,除了最后一项之外的所有项目都可以完成(按照您期望的方式)。由于安全协议,silverlight 无法访问用户的驱动器并对其进行操作。您可以获得的最接近的方法是访问 silverlight 的应用程序存储,在这种情况下这对您没有任何帮助。我将重点介绍如何执行前 4 项。

  • 允许用户选择文件夹位置并显示文件夹内容

    public void OnSelectPDF(object sender)
    {
    //create the open file dialog
    OpenFileDialog ofg = new OpenFileDialog();
        //filter to show only pdf files
    ofg.Filter = "PDF Files|*.pdf";
    ofg.ShowDialog();
    byte[] _import_file = new byte[0];
    //once a file is selected proceed
    if (!object.ReferenceEquals(ofg.File, null))
    {
    
        try
        {
            fs = ofg.File.OpenRead();
            _import_file = new byte[fs.Length];
            fs.Read(_import_file, 0, (int)fs.Length);
        }
        catch (Exception ex)
        {
        }
        finally
        {
            if (!object.ReferenceEquals(fs, null))
                fs.Close();
        }
        //do stuff with file - such as upload the file to the server
    };
    }
    

    如果您注意到,在我的示例中,一旦文件被检索到,我建议将其上传到网络服务器或具有临时公共访问权限的地方。我建议通过 Web 服务执行此操作。例如

    //configure the system file (customn class)
    TSystemFile objFile = new TNetworkFile().Initialize();
    //get the file description from the Open File Dialog (ofg)
    objFile.Description = ofg.File.Extension.Contains(".") ? ofg.File.Extension : "." +  ofg.File.Extension;
    objFile.FileData = _import_file;
    objFile.FileName = ofg.File.Name;
    //upload the file
    MasterService.ToolingInterface.UploadTemporaryFileAsync(objFile);
    

上传此文件后,在异步结果中,很可能会返回临时文件名和上传位置,我会在浏览器中转发对某些 javascript 方法的调用,以使用通用的“download.aspx?fileName=givenFileName”技术强制在用户系统上下载,这将负责保存到新位置打印。这就是你所寻求的。

javascript 技术的示例(记得包括 System.Windows.Browser):

public void OnInvokeDownload(string _destination)
{
    //call the browser method/jquery method 
    //(I use constants to centralize the names of the respective browser methods)
    try
    {
        HtmlWindow window = HtmlPage.Window;
        //where BM_INVOKE_DOWNLOAD is something like "invokeDownload"
        window.Invoke(Constants.TBrowserMethods.BM_INVOKE_DOWNLOAD, new object[] { _destination});
    }
    catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.ToString()); }
}

确保您的 javascript 方法存在于包含的 javaScript 文件或与您的 silverlight 应用程序相同的托管页面中。例如:

function invokeDownload(_destination) {
//some fancy jquery or just the traditional document.location change here
//open a popup window to http://www.myurl.com/downloads/download.aspx?    fileName=_destination
}

download.aspx 的代码超出了我的回答范围,因为它因需要而异,并且只会延长这篇文章(更多)。但是从我给出的内容来看,它会为你正在寻找的东西“工作”,但可能并不完全符合你的预期。但是,请记住,这主要是由于 Silverlight 的限制。这种方法的作用不是强迫您需要插件才能在应用程序中查看 pdf 文件,而是允许用户计算机通过使用现有的 adobe pdf 阅读器来播放它的一部分。在silverlight 中,至少据我所知,大多数印刷都是使用您所称的和作为UIElement 的“ImageVisual”完成的。要直接从 silverlight 打印 pdf,您需要在 silverlight 控件中查看该 PDF,或要求 Web 服务将 PDF 呈现为图像,然后将该图像放在控件中。只有这样你才能直接打印。我将这种方法介绍为更干净和直接的方法。

注意 - 对于临时目录,我建议每次添加文件时对服务器端的文件进行一些时间跨度的清理。节省您定期运行某些任务以检查文件夹并删除旧文件的工作。;)

于 2012-04-20T11:29:11.533 回答