目录

迁移至 DotNetBrowser 1.7+ 版本

在 DotNetBrowser 1.7 版本中,我们对公共 API 引入了一些变更。这些变更可能需要对您的应用程序源代码进行调整。本指南将向您展示如何将以旧版 API(例如 DotNetBrowser 1.6.4)编写的应用程序源代码迁移到 DotNetBrowser 1.7 版本中引入的新 API。

Frames IDs 

1.6.4
Browser.GetFramesIds() 方法会返回当前加载网页上所有 frame 的 ID。但它不允许获取位于另一个 frame 内部的框架 ID。

C#

var framesIds = browser.GetFramesIds();

VB.NET

Dim framesIds = browser.GetFramesIds()

1.7
现在,Browser.GetFramesIds() 方法仅返回主 frame 的 ID。要获取嵌套在其他 frame 内部的 frame ID,新增了 Browser.GetFramesIds(long frameId) 方法。

C#

List<long> framesIds = browser.GetFramesIds();

foreach (long framesId in framesIds) {
    List<long> subFramesIds = browser.GetFramesIds(framesId);
}

VB.NET

Dim framesIds As List(Of Long) = browser.GetFramesIds()

For Each framesId As Long In framesIds
    Dim subFramesIds As List(Of Long) = browser.GetFramesIds(framesId)
Next

使用 BrowserFunction 

1.6.4
要注册一个全局的 JavaScript 函数,可以使用 Browser.RegisterFunction(String functionName, BrowserFunction function) 方法。每次网页加载时,DotNetBrowser 都会创建一个名为 functionName 的函数,并将其附加到 JavaScript 全局对象 window 上。

C#

public class MyFunction: BrowserFunction{
            public JSValue invoke(params JSValue[] args)
            {
                    return JSValue.CreateNull();
            }
}
// 用法
browser.RegisterFunction("save", new MyrFunction());

VB.NET

Public Class MyFunction
    Implements BrowserFunction

    Public Function invoke(ParamArray args As JSValue()) As JSValue _
        Implements BrowserFunction.invoke
        Return JSValue.CreateNull()
    End Function
End Class

'用法'
browser.RegisterFunction("save", New MyrFunction())

该函数将被注入到每个加载的网页的 JavaScript 中,直到您使用 Browser.UnregisterFunction(String functionName) 方法取消注册为止。

1.7
BrowserFunction API 现在已成为 JSObject 类的一部分。现在,要注册一个全局 JavaScript 函数,您需要使用以下代码示例:

C#

    public class SaveObject
        {
            public void Save(String firstName, String lastName)
            {
                Console.Out.WriteLine("firstName = " + firstName);
                Console.Out.WriteLine("lastName = " + lastName);
            }
        }

// 用法

browser.FinishLoadingFrameEvent += delegate(object sender, FinishLoadingEventArgs e)
            {
                if (e.IsMainFrame)
                {
                    JSValue value = browser.ExecuteJavaScriptAndReturnValue("window");
                    value.AsObject().SetProperty("save", new SaveObject());
                }
            };

VB.NET

Public Class SaveObject
    Public Sub Save(ByVal firstName As String, ByVal lastName As String)
        Console.Out.WriteLine("firstName = " & firstName)
        Console.Out.WriteLine("lastName = " & lastName)
    End Sub
End Class

'用法'
AddHandler browser.FinishLoadingFrameEvent sub(ByVal sender As Object, ByVal e As FinishLoadingEventArgs)

    If e.IsMainFrame Then
        Dim value As JSValue = browser.ExecuteJavaScriptAndReturnValue("window")
        value.AsObject().SetProperty("save", New SaveObject())
    End If
End sub

每次加载或重新加载网页时,都必须将该对象注入到 JavaScript 中。当加载新的网页或刷新现有页面时,该对象会自动被移除。

打印为 PDF 

1.6.4
在 DotNetBrowser 1.6.4 中,要将当前加载的网页打印为 PDF 文档,可以使用 Browser.PrintToPDF() 方法。该方法使用预定义设置将网页打印为 PDF 文件。以下代码示例演示了如何将网页打印为 PDF 文件,并在打印完成时收到通知:

C#

browser.PrintToPDF("web_page.pdf", delegate(object sender, PrintJobEventArgs e)
{
    //当打印完成时,将调用此处理程序。
});

VB.NET

browser.PrintToPDF("web_page.pdf", sub(ByVal sender As Object, ByVal e As PrintJobEventArgs)
    '当打印完成时,将调用此处理程序。'
End sub)

1.7
在 DotNetBrowser 1.7 中,我们扩展了 Printing API ,并新增功能,使您可以决定网页是通过打印机设备打印,还是保存为 PDF 文档。Browser.PrintToPDF() 方法已被移除。现在,您必须在 PrintHandler 的实现中决定网页是保存为 PDF 还是通过打印机打印。以下代码示例演示了如何处理打印,指示 Chromium 使用指定的打印设置将网页保存为 PDF 文档,并在打印完成时收到通知:

C#

class MyPDFPrintHandler : PrintHandler
{
    Func<PrintSettings, PrintSettings> func;

    public MyPDFPrintHandler(Func<PrintSettings, PrintSettings> func)
    {
        this.func = func;
    }

    public PrintStatus OnPrint(PrintJob printJob)
    {
        PrintSettings printSettings = func(printJob.PrintSettings);
        printSettings.PrintToPDF = true;
        printSettings.Landscape = true;
        printSettings.PrintBackgrounds = true;
        printSettings.PageMargins = new PageMargins(20, 40, 40, 20);
        printJob.PrintJobEvent += (s, e) =>
        {
            //当打印完成时,将调用此处理程序。
        };
        return PrintStatus.CONTINUE;
    }
}

// 用法

browser.PrintHandler = new MyPDFPrintHandler((printSettings) =>
{
    printSettings.PDFFilePath = fileName;
    return printSettings;
});

browser.Print();

VB.NET

Class MyPDFPrintHandler
    Implements PrintHandler

    Private func As Func(Of PrintSettings, PrintSettings)

    Public Sub New(ByVal func As Func(Of PrintSettings, PrintSettings))
        Me.func = func
    End Sub

    Public Function OnPrint(ByVal printJob As PrintJob) As PrintStatus _
        Implements PrintHandler.OnPrint
        Dim printSettings As PrintSettings = func(printJob.PrintSettings)
        printSettings.PrintToPDF = True
        printSettings.Landscape = True
        printSettings.PrintBackgrounds = True
        printSettings.PageMargins = New PageMargins(20, 40, 40, 20)
        AddHandler printJob.PrintJobEvent, sub(s, e)
            '当打印完成时,将调用此处理程序。'
        End sub

        Return PrintStatus.CONTINUE
    End Function
End Class

'用法'
browser.PrintHandler = New MyPDFPrintHandler(Function(printSettings)
    printSettings.PDFFilePath = fileName
    Return printSettings
End Function)
browser.Print()