我对业务应用程序有以下要求:
(所有这些都可以在本地或服务器上)
如何在Silverlight中实现这一目标?
亲切的问候,
下流
答案 0 :(得分: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
};
}
如果您注意到,在我的示例中,一旦检索到文件,我建议将其上传到网络服务器或具有临时公共访问权限的地方。我建议通过网络服务这样做。 E.g
//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文件中或与Silverlight应用程序位于同一主机页面中的javascript方法存在。 E.g:
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的代码超出了我的答案范围,因为它根据需要而变化,只会延长这篇文章(很多)。但是从我给出的内容来看,它将“适用于”您正在寻找的东西,但可能并不完全符合您的预期。但请记住,这主要是由于银光限制。这种方法的作用不是强迫您在应用程序中查看pdf文件,而是允许用户计算机通过使用现有的adobe pdf阅读器来播放它。在Silverlight中,大多数打印,至少据我所知,使用你所称的和“ImageVisual”来完成,这是一个UIElement。要直接从silverlight打印pdf,您需要在silverlight控件中查看该PDF,或者要求Web服务将PDF呈现为图像,然后将该图像放在控件中。只有这样才能直接打印。我提出这种方法是一种更加干净和直接的方法。
一个注意事项 - 对于临时目录,我建议每次添加文件时,在服务器端的某些时间段进行清理。为您节省定期运行某些任务的工作,以检查文件夹并删除旧文件。 ;)