在.net -4.0 WPF应用程序中查看HTML5页面时出现问题

Trouble viewing HTML5 pages in a .Net-4.0 WPF Application

本文关键字:HTML5 问题 net WPF 应用程序      更新时间:2023-09-26

我对c#和。net比较陌生,这是我的第一个WPF项目,所以我希望这只是我缺乏熟悉和Google-Fu薄弱的情况。

我需要为HTML5开发工具创建一个预览窗口。该页面将包含javascript, ogg vorbis和/或mpeg4 (m4a)音频和png图像。

Frame控件似乎可以很好地查看文件。我最初尝试了WebBrowser控件,但它似乎是基于IE7的,不支持我需要的功能。框架似乎使用已安装的IE9,这是我需要的。问题似乎是在加载内容。

如果页面托管在基于apache的web服务器上,我可以让它工作,但这绝对不是首选的解决方案。专业的web开发人员不是目标受众,所以我觉得期望用户能够安装和配置一个是不合理的。我曾尝试使用HttpListener实现一个裸骨架服务器,但是(a)它似乎并不比直接设置Frame Source="C:/test_project_path/index.html"更好,(b)如果用户已经有一个web服务器在他们的机器上运行,我不想创造任何问题。当我试图添加前缀时,我遇到了"与现有注册冲突"的问题——即使我没有安装其他web服务器,更不用说运行了,而且我验证了没有其他服务器使用相同的端口——这让我犹豫是否要依赖它。

我真正想做的是:

myFrame.Navigate("C:/test_project_path/index.html");

这几乎可以工作。我似乎得到了图形元素,但javascript应用程序崩溃与"无法获得属性值:对象为空或未定义"错误。因为,正如我所说,它的工作时,从Apache服务,似乎问题是,并不是所有的javascript文件都正确加载。

我的问题:

有我遗漏的设置吗?我得到一个关于活动内容的安全警告,我必须点击通过。我很想摆脱它,但如果它与我目前的问题没有直接关系,那就不是我现在主要关心的了。

是否有一些方法来检查框架控件是否正在做所有必要的子请求来加载页面,并且它们正在被完成?把手表放在myFrame上,我只能看到初始页面(index.html)。除了myFrame渲染和我得到的javascript错误之外,似乎没有办法判断各种子元素是否存在。

我需要调用javascript文件与InvokeScript(),还是只是为了从WPF控件访问功能?

Edit:一个更通用的解决方案可以在这里找到:http://forums.devshed.com/net-development-87/serving-images-using-httplistener-414552.html它似乎适用于我正在处理的所有文件类型。

似乎问题在于服务器为输出流编码非文本文件的方式。我是这样做的,这或多或少是我在网上找到的大多数例子中的做法:

StreamReader streamReader = new StreamReader(requestUrl);
byte[] buffer = Encoding.UTF8.GetBytes(streamReader.ReadToEnd());
response.ContentLength64 = buffer.Length;
response.OutputStream.Write(buffer, 0, buffer.Length);
response.OutputStream.Close();

对于文本文件,如html和javascript,这工作得很好,但对于图像,它似乎抛出了一堆额外的垃圾,基本上加倍的文件大小。解决方案是将图像作为图像读取,然后将其保存到输出流:

Image image1 = Image.FromFile(requestUrl);
image1.Save(response.OutputStream, System.Drawing.Imaging.ImageFormat.Png);
response.OutputStream.Close();

显然,您需要更改ImageFormat来处理您想要提供的任何图像类型。这适用于png文件,我怀疑声音文件的解决方案是类似的,尽管我还没有解决这个问题。