2015-08-25 84 views
1

我想創建一個類,當我創建它的一個實例,然後它將有一個Web瀏覽器控件,我可以與之交互。當我在主窗體中創建瀏覽器控件時,我的代碼工作正常,但是當我嘗試將它抽象到它自己的類時,我並不理解winforms的工作方式。我猜測我需要繼承或者初始化它,但我不確定。如何在單獨的類中創建Web瀏覽器控件?

下面是類代碼:

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")] 
[System.Runtime.InteropServices.ComVisibleAttribute(true)] 
public class MyBrowserFuncs 
{ 
    public WebBrowser WB; 
    public MyBrowserFuncs() 
    { 
     WB = new WebBrowser(); 

     WB.ObjectForScripting = this; 

     WB.Navigate("mypage.html"); 
    } 
    public string Test(string msg) 
    { 
     return WB.Document.InvokeScript 
          ("Test", new String[] { msg }); 
    } 
} 

這裏是上的mypage.html

function Test(msg) 
{ 
    alert(msg); 

    return "success"; 
} 

相應的JavaScript這裏是我怎麼想它調用C#

private void btnSomething_Click(object sender, EventArgs e) 
{ 
    var web = new MyBrowserFuncs(); 

    var text = web.Test("this is a message"); 
} 

我沒有得到任何錯誤,但它不起作用。它在主表單中使用代碼時有效。我猜測這可能與InitializeComponent();有關,但我並不是100%確定如何創建和處理控件,當我不需要它們可見並想將它們抽象爲一個類時。

我在做什麼錯?

+0

如果您沒有以任何形式顯示網絡瀏覽器,應該在哪裏顯示警報?你需要將它附加到表單的某個地方。如果你只是想要一個工具來運行JavaScript,那裏有庫讓你從.NET運行JS,就像https://github.com/JavascriptNet/Javascript.Net –

+0

試過javascript解釋器,但是我正在與之交互的API失敗如果它不能與DOM交互,那麼我正在使用無頭瀏覽器。如果我刪除警報並返回值,它仍然不起作用。我希望能夠創建可變數量的隱藏瀏覽器控件。我怎樣才能將它重新添加到表單中? – Guerrilla

+0

此外,在我沒有將它添加到實際窗體的代碼中,我剛剛將它聲明爲窗體類中的一個屬性,並且警報工作,即使實際上沒有窗體上的Web瀏覽器控件 – Guerrilla

回答

0

在MyBrowserFuncs類的測試方法中,接受WebBrowser實例以及字符串。這會讓你訪問它。例如:

public string Test(string msg, WebBrowser WB) 
{ 
    return WB.Document.InvokeScript 
         ("Test", new String[] { msg }); 
} 

只是想編輯,也許解釋多一點。你正在試圖讓你的WebBrowser對象在類中。我將它放在主Form1類中,但如果將它作爲WebBrowserFuncs方法的參數傳遞(WebBrowser控件),則這些方法將能夠與Form1的控件進行交互,而不會出現問題。

0

它的工作原理,如果我添加了控制返回給調用的形式,所以我這樣做:

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")] 
[System.Runtime.InteropServices.ComVisibleAttribute(true)] 
public class MyBrowserFuncs 
{ 
    public WebBrowser WB; 
    public MyBrowserFuncs(Form f) 
    { 
     WB = new WebBrowser(); 
     WB.Visible = false; 
     f.Controls.Add(WB); 
     WB.ObjectForScripting = this; 

     WB.Navigate("mypage.html"); 
    } 
    public string Test(string msg) 
    { 
     return WB.Document.InvokeScript 
          ("Test", new String[] { msg }); 
    } 
} 

然後我把它叫做是這樣的:

private async void btnSomething_Click(object sender, EventArgs e) 
{ 
    var web = new MyBrowserFuncs(this); 
    await Task.Delay(1000); 
    var text = web.Test("this is a message"); 
} 

我加入了延遲只是爲了看看它的工作原理就是這樣。我會重構那個。