2017-10-14 68 views
0

WPF應用程序我有一個WPF用戶控件承載使用WebBrowser控件的ASP.Net MVC應用程序。觸發事件,以接待來自WebBrowser控件

我想,當對WebApplication的執行一定的動作來通知用戶控件。 有什麼可能的方法來實現這個目標?

+0

您可以修改ASP.NET應用程序?如果是的話,那麼你就可以在瀏覽器控件的'ObjectForScripting'屬性設置爲可以通過從JavaScript的網站通過'window.external'調用的類的實例。 –

回答

1

由於@SzabolcsDézsi在評論中提到,如果你有訪問Web應用程序可以使用WebBrowser.ObjectForScripting,以實例的對象,並從JavaScript調用它的方法。下面是一個簡單的演示:

[ComVisible(true)] // Class must be ComVisible 
public class Demo 
{ 
    public void SayHello(string name) => MessageBox.Show($"Hello {name} !!!"); 
} 

創建這個類的一個實例,一個將其分配到WebBrowser控件的ObjectForScripting屬性:

webBrowser.ObjectForScripting = new Demo(); 

,說我們在WebBrowser控制顯示這個簡單的html頁面:

<html> 
<head> 
    <title></title> 
    <script> 
     function sayhello() 
     { 
      var name = document.getElementById('name').value; 
      // the window.external is assigned an instance of 
      // class we created above. 
      // We can call C# instance method SayHello directly. 
      window.external.SayHello(name); 
     } 
    </script> 
</head> 
<body> 
    <form action="#" method="post"> 
     <input id="name" type="text" name="name" value="" /> 
     <input type="submit" name="submit" value="Say Hello" onclick="sayhello()" /> 
    </form> 
</body> 
</html> 

現在,只要填寫名稱並單擊SayHello按鈕,它就會按預期顯示MessageBox。

此外你的財產WebBrowser.Document這是生活在Microsoft HTML對象庫(MSHTML)COM庫的HtmlDocument一個實例,確保引用在您的項目。

文檔屬性,可以查詢當前頁面的DOM對象,並通過它,你可以通過由HtmlDocument類像HtmlDocument.getElementById()和許多其他暴露的方法處理JavaScript的HTML頁面等。

webBrowser.LoadCompleted += new LoadCompletedEventHandler((o, e) => 
{ 
    if (webBrowser.Document is HTMLDocument DOM) 
    { 
     var namefield = DOM.getElementById("name"); 
     namefield.setAttribute("value", "Enter your name!!!"); 
    } 
}); 

希望這有助於你理解WebBrowser控制提供了操縱加載頁面的力量:

例如該代碼從上面頁面後html頁面修改名稱輸入的值屬性由WebBrowser控件加載。

+1

這是一個非常好的解釋。試了一樣,像魅力一樣工作!謝謝! – user2143645