CefSharp.Wpf.ChromiumWebBrowser 设置 Window.Name
CefSharp.Wpf.ChromiumWebBrowser SET Window.Name
在 WPF 应用程序中使用 CefSharp 浏览器,我们需要传递 Window 名称(在 MVC 网络应用程序中,只需在 jQuery 在视图上)但我不确定在调用 .Address
之前如何使用 WPF 中的嵌入式浏览器执行此操作
任何指点将不胜感激:-)
标记为已接受的答案,因为它确实回答了问题,只是发现它在加载页面后发生了变化。最后传递给一个函数完成了工作,就像这样
Private Sub FrameLoaded(sender As Object, e As CefSharp.FrameLoadEndEventArgs)
Try
Me.Dispatcher.Invoke(Sub()
Dim vBrowser As CefSharp.Wpf.ChromiumWebBrowser = WebsiteLogin_Grid.FindName("WebsiteLogin_WebBrowser")
vBrowser.ExecuteScriptAsync("loadFromManager(" & Current_ID & "); ")
End Sub)
Catch ex As Exception
EmailError(ex)
End Try
End Sub
您必须将 属性 绑定到 WPF 视图,如下所示。
<Window x:Class="CefSharp.MinimalExample.Wpf.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpf="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
xmlns:cef="clr-namespace:CefSharp;assembly=CefSharp.Core"
xmlns:behaviours="clr-namespace:CefSharp.MinimalExample.Wpf.Behaviours"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
Title="{Binding Path=Title, ElementName=Browser, Converter={StaticResource TitleConverter}}"
WindowState="Maximized">
</Window>
转换器代码如下所示:
public class TitleConverter : IValueConverter
{
object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return "value ?? "No Title Specified";
}
object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
}
参考this documentation at github.
如果你想要window.name或任何其他属性,解决方案是注册JS对象:
webBrowser.RegisterJsObject("cefCallback", new JavascriptAdapter());
在 JavascriptAdapter class 中你可以创建一个方法
public void SetWindowName(string name)
{
//// your code
}
然后您可以从 HTML 页面的 javascript 调用此方法。
window["cefCallback].setWindowName(window.name);
如果您不拥有 HTML 页面并且无法更改页面代码,则可以使用 ExecuteScriptAsync 到 运行 一个 javascript 方法并在 C# 中获取结果。
在 WPF 应用程序中使用 CefSharp 浏览器,我们需要传递 Window 名称(在 MVC 网络应用程序中,只需在 jQuery 在视图上)但我不确定在调用 .Address
之前如何使用 WPF 中的嵌入式浏览器执行此操作任何指点将不胜感激:-)
标记为已接受的答案,因为它确实回答了问题,只是发现它在加载页面后发生了变化。最后传递给一个函数完成了工作,就像这样
Private Sub FrameLoaded(sender As Object, e As CefSharp.FrameLoadEndEventArgs)
Try
Me.Dispatcher.Invoke(Sub()
Dim vBrowser As CefSharp.Wpf.ChromiumWebBrowser = WebsiteLogin_Grid.FindName("WebsiteLogin_WebBrowser")
vBrowser.ExecuteScriptAsync("loadFromManager(" & Current_ID & "); ")
End Sub)
Catch ex As Exception
EmailError(ex)
End Try
End Sub
您必须将 属性 绑定到 WPF 视图,如下所示。
<Window x:Class="CefSharp.MinimalExample.Wpf.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpf="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
xmlns:cef="clr-namespace:CefSharp;assembly=CefSharp.Core"
xmlns:behaviours="clr-namespace:CefSharp.MinimalExample.Wpf.Behaviours"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
Title="{Binding Path=Title, ElementName=Browser, Converter={StaticResource TitleConverter}}"
WindowState="Maximized">
</Window>
转换器代码如下所示:
public class TitleConverter : IValueConverter
{
object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return "value ?? "No Title Specified";
}
object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
}
参考this documentation at github.
如果你想要window.name或任何其他属性,解决方案是注册JS对象:
webBrowser.RegisterJsObject("cefCallback", new JavascriptAdapter());
在 JavascriptAdapter class 中你可以创建一个方法
public void SetWindowName(string name)
{
//// your code
}
然后您可以从 HTML 页面的 javascript 调用此方法。
window["cefCallback].setWindowName(window.name);
如果您不拥有 HTML 页面并且无法更改页面代码,则可以使用 ExecuteScriptAsync 到 运行 一个 javascript 方法并在 C# 中获取结果。