0

基本上,我要做的是从bgDivBing 上的元素中获取背景图像并将其用作表单背景。这就是我到目前为止所拥有的。

Try
    With bingCheck
        Dim bgDiv As HtmlElement = .Document.GetElementById("bgDiv")
        Dim imgUrl As String = bgDiv.Style("background-image").ToString

        Dim request As HttpWebRequest = DirectCast(HttpWebRequest.Create(imgUrl), HttpWebRequest)
        Dim response As Net.HttpWebResponse = DirectCast(request.GetResponse, Net.HttpWebResponse)
        Dim grabbedImage As Image = Image.FromStream(response.GetResponseStream)
        response.Close()

        Me.BackgroundImage = grabbedImage
        Me.Update()
    End With
Catch ex As Exception
End Try

这似乎不起作用,所以关于我如何做到这一点还有其他想法吗?

4

2 回答 2

1

首先要做的事情:您得到的错误是因为您尝试在字符串上调用索引器(使用字符串键),并且它只有一个整数索引器。您可以通过查看以下内容了解这一点System.Windows.Forms.HtmlElement.Style property

获取或设置当前元素的以逗号分隔的样式列表。

它将返回当前元素上的所有样式,但作为一个长字符串。还有另外两种以不同方式获取值的方法,见下文。

查看 Style 属性内容后,它包含以下内容:

"左:0px;上:-0.5px;宽:1000px;高:563px;不透明度:1;背景图像:url("http://be.bing.com/az/hprichbg?p=rb%2fPenzanceHarbor_ROW9689010992_1366x768. jpg");"

您可以使用此方法轻松检索值:

Dim bgimage As String
bgimage = Array.Find(Of String)(bgDiv.Style.Split("; "),
                                Function(s As String) s.Contains("background-image")) _ 
          .Replace("background-image:", "") _
          .Trim()

但是还有一个问题,见最后一段。

关于其他两种方法。

第一种方法是调用HtmlDocument.InvokeScript(String, Object()) Method. 这将使用提供的参数执行给定的 JavaScript 函数并返回该函数的(返回)值。现在,我们可以使用哪个功能?好吧,我们可以用eval这个表达式来返回bgDiv元素的背景图像。代码将如下所示:

Dim bgimage As String
bgImage = bingCheck _
          .Document _
          .InvokeScript("eval",
                        {"window.getComputedStyle(document.getElementById(""bgDiv"")).backgroundImage"})

它返回以下值:

url("http://be.bing.com/az/hprichbg?p=rb%2fPenzanceHarbor_ROW9689010992_1366x768.jpg")

现在我认为从那里提取 URL 非常简单。

现在第二种方法是访问 COM 对象本身。这需要你引用Microsoft HTML Object Library(它是一个 COM 引用!!)。之后,您可以使用mshtml命名空间。

在代码中检索 bgDiv 元素后,我们将 DomElement 转换为 COM 对象,我们可以通过那里访问属性。以下代码可以做到这一点:

Dim bgDiv As HtmlElement = bingCheck.Document.GetElementById("bgDiv")
Dim bgimage As String = DirectCast(bgDiv.DomElement, mshtml.IHTMLElement2) _
                        .currentStyle _
                        .backgroundImage

在 bgimage 变量中,您会发现与前一种方法相同的输出:

url("http://be.bing.com/az/hprichbg?p=rb%2fPenzanceHarbor_ROW9689010992_1366x768.jpg")

我之前说的问题是什么?好吧,您不能使用 ,WebBrowser.DocumentCompleted event因为尚未(并非总是)应用 CSS,因此该getComputedStyle函数(或Style属性)将为您Nothing提供背景图像的回报。您可以使用计时器来查找属性,也可以使用在页面加载后手动单击的按钮(并在单击事件中检索背景图像)。

于 2012-11-05T21:35:18.200 回答
0

根据 MSDN,HtmlElement 的样式属性是一个字符串。

http://msdn.microsoft.com/en-us/library/system.windows.forms.htmlelement.style.aspx

它是由分号分隔的名称值对。

style-name1:value1;...;[style-nameN:valueN;]

所以你需要解析出你需要的值。

Dim styles as String() = bgDiv.Style.Split(";")
于 2012-11-05T21:36:20.263 回答