我对业务应用程序有以下要求:
(所有这些都可以在本地或服务器上)
- 允许用户选择文件夹位置
- 显示文件夹内容
- 打印文件夹中的选定项目 (*.pdf)
- 显示已打印的文件
- 可能将打印的文件移动到新位置(打印的子文件夹)
如何在 Silverlight 中实现这一点?
亲切的问候,
下流的
我对业务应用程序有以下要求:
(所有这些都可以在本地或服务器上)
如何在 Silverlight 中实现这一点?
亲切的问候,
下流的
首先,除了最后一项之外的所有项目都可以完成(按照您期望的方式)。由于安全协议,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 呈现为图像,然后将该图像放在控件中。只有这样你才能直接打印。我将这种方法介绍为更干净和直接的方法。
注意 - 对于临时目录,我建议每次添加文件时对服务器端的文件进行一些时间跨度的清理。节省您定期运行某些任务以检查文件夹并删除旧文件的工作。;)