我目前正在尝试使用.NET WebBrowser来显示我正在编写的应用程序的帮助信息(存储在本地html文件中),但是我遇到了两个与超链接相关的问题。
首先,我有一个搜索功能,它以file:\\\C:\...
格式返回正确的URL我可以将其复制并粘贴到浏览器中,然后在那里导航。然而,点击控件内的链接本身什么都不做。
其次,HTML文件都包含其他HTML文件的相对路径。这些当然不起作用,因为我最终得到的file:\\\C:\help.html
给了我'网页不可用'。但是,如果不解析HTML文件并将目录路径连接到链接前面,我就无法想到让它工作的方法。
编辑:为了澄清,在第一个问题中,我在用户输入时动态构建搜索结果页面。 HTML包含几个与此类似的结果(是的,它未完成,我只是向您展示链接部分):
<a style='font-family:verdana;color:#0645AD;font-size:20px;text-decoration:underline' href='C:\Users\User\Documents\project\bin\Debug\..\..\Help\FAQ.html'>FAQ</a><br />...This is the <b>FA</b>Q File.
现在,当我点击控件中的该链接没有任何反应时,它不会给我'网页不可用'或带我到实际的页面。但是,保存HTML并使用Chrome,IE和Firefox打开它可以正常工作。
在第二个问题中,我为不同的部分提供了不同的帮助文件,每个部分都包含与其他部分相关的链接。 VB将它们作为直接路径选择,并尝试从根目录转到那里,即文件:\\ C:\ file.html。我能想到的唯一解决方案是解析文件并使用WebBrowser.Navigate(Path.Combine(pathToDirectory, nameOfHelpFile.html)
,这看起来效率要低得多。
由于
答案 0 :(得分:0)
我认为您需要向我们展示一些代码,以确切了解您的问题所在。我编写了一个快速示例,将WebBrowser
控件与一个HTML文件一起使用,该文件链接到另一个,并且其工作正常。
相对链接相对于正在浏览的当前文档。如果您正在将原始HTML写入浏览器,那么我认为链接相对于它认为是root的内容可能是file:///c:/
,但我不确定。此外,如果您的文件实际存在于驱动器的根目录中,则可能会遇到权限问题。
以下是适合我的样本:
Option Strict On
Option Explicit On
Imports System.IO
Public Class Form1
Private WithEvents WebB As WebBrowser
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
''//Create our web browser
Me.WebB = New WebBrowser()
''//Set it to fill the form
Me.WebB.Dock = DockStyle.Fill
''//Add it to the form
Me.Controls.Add(Me.WebB)
''//We will put our HTML files in this folder which is on the desktop
Dim WorkingFolder = Path.Combine(My.Computer.FileSystem.SpecialDirectories.Desktop, "HTMLTest")
''//Create it if it doesn't exist
If Not Directory.Exists(WorkingFolder) Then Directory.CreateDirectory(WorkingFolder)
''//The names of the two files that we are creating
Dim FirstFile = "Start.html"
Dim SecondFile = "End.html"
''//Write HTML in the first file that has a link to the second file
My.Computer.FileSystem.WriteAllText(Path.Combine(WorkingFolder, FirstFile), <html><head><title>Start</title></head><body><a href=<%= SecondFile %>>Link to second file</a></body></html>.ToString(), False)
''//Write HTML in the second file
My.Computer.FileSystem.WriteAllText(Path.Combine(WorkingFolder, SecondFile), <html><head><title>End</title></head><body>This is the second file</body></html>.ToString(), False)
''//Tell the web browser to navigate to the second file
Me.WebB.Navigate(Path.Combine(WorkingFolder, FirstFile))
End Sub
End Class
答案 1 :(得分:0)
修复包括在WebBrowser控件的“导航”事件中添加一些代码。
Private Sub HelpBrowser_Navigating(sender As System.Object, e As System.Windows.Forms.WebBrowserNavigatingEventArgs) Handles HelpBrowser.Navigating
If e.Url.Scheme = "about" And e.Url.AbsolutePath <> "blank" Then
' The clicked URL is of the format about:<file>.
HelpBrowser.Navigate(HelpRootPath + "\" + e.Url.AbsolutePath)
End If
End Sub