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