github
安裝 PM> Install-Package CefSharp.Wpf
解決方案->屬性->配置屬性->活動解決方案平台—新建-x64
在需要使用的窗體上引用xmlns:cefSharp="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
重新生成解決方案
引用
<cefSharp:ChromiumWebBrowser Name="browser" Grid.Row="0" Address="http://www.baidu.com" Margin="10,43,10,10"/>
加載頁面
var value="http://cnglogs.com/ives";
browser.Load(value);
獲取IBrowser對象,對頁面的前進、后退操作需要此對象
private IBrowser IBrowser
{
get
{
return browser.GetBrowser();
}
}
IBrowser.GoForward();//前進
IBrowser.Reload();//重載
IBrowser.StopLoad();//停止
IBrowser.GoBack();//后退
加載svg
安裝:Install-Package SharpVectors -Version 1.0.0
添加引用xmlns:svgc="http://sharpvectors.codeplex.com/svgc/"
<Button x:Name="btnPrev" HorizontalAlignment="Left" Width="32" Height="32" Margin="29,10,0,10" Click="btnPrev_Click_1" VerticalAlignment="Top">
<svgc:SvgViewbox IsHitTestVisible="False" Source="pack://application:,,,/resources/svg/arrow-left-2.svg"/>
</Button>
需要注意引用方式 Source="pack://application:,,,/1.svg" ,這樣才能正確的引用資源。
svg 文件的屬性默認是內容,務必改為 Resource
在同一個頁面中打開鏈接
CefSharp中控制彈窗的接口是 ILifeSpanHandler,對OnBeforePopup進行重寫
首先定義操作類
public class OpenPage : ILifeSpanHandler
{
public bool DoClose(IWebBrowser browserControl, IBrowser browser)
{
return false;
}
public void OnAfterCreated(IWebBrowser browserControl, IBrowser browser)
{
}
public void OnBeforeClose(IWebBrowser browserControl, IBrowser browser)
{
}
public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl,
string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures,
IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
{
newBrowser = null;
var chromiumWebBrowser = (ChromiumWebBrowser)browserControl;
chromiumWebBrowser.Load(targetUrl);
return true; //Return true to cancel the popup creation copyright by codebye.com.
}
}
然后添加處理事件 browser.LifeSpanHandler = new OpenPage();
wpf與js互相調用、傳值
首先創建測試類來處理前台js請求
public class TestClass
{
public int testFunc(string msg="test")
{
MessageBox.Show($"Get msg:{msg}");
return 1;
}
}
將處理方法注入容器
private void Window_Loaded(object sender, RoutedEventArgs e)
{
InjectMessages();
}
/// <summary>
/// 注入事件消息
/// </summary>
public void InjectMessages()
{
browser.JavascriptObjectRepository.ResolveObject += (s, eve) =>
{
var repo = eve.ObjectRepository;
if (eve.ObjectName == "TestObj")
{
repo.Register("TestObj", new TestClass(), isAsync: true, options: BindingOptions.DefaultBinder);
}
};
}
在前台綁定
<script>
// 注入
CefSharp.BindObjectAsync("TestObj");
function callBackEnd(msg) {
TestObj.testFunc(msg).then((r) => {
alert("Get result:"+r);
})
}
</script>
issue
- 無法同時給容器設置兩種對齊方式(垂直對齊、水平對齊)
會觸發異常
System.Exception:“The browser has not been initialized. Load can only be called after the underlying CEF browser is initialized (CefLifeSpanHandler::OnAfterCreated).”
flash支持
訪問 http://get.adobe.com/cn/flashplayer/otherversions/ 選擇“Flash Player for Other Browsers”。
- 將安裝flash后得到的C:\Windows\SysWOW64\Macromed\Flash\pepflashplayer32_32_0_0_303.dll復制到項目目錄並修改屬性為復制
- 初始化cef的時候添加對flash的支持
var settings = new CefSettings();
// Set BrowserSubProcessPath based on app bitness at runtime
settings.BrowserSubprocessPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
Environment.Is64BitProcess ? "x64" : "x86",
"CefSharp.BrowserSubprocess.exe");
//添加flash支持
settings.CefCommandLineArgs["enable-system-flash"] = "1";
settings.CefCommandLineArgs.Add("ppapi-flash-version", "32.0.0.303");
//必須使用AppDomain.CurrentDomain.BaseDirectory拼接
settings.CefCommandLineArgs.Add("ppapi-flash-path", AppDomain.CurrentDomain.BaseDirectory + "Plugins\\pepflashplayer32_32_0_0_303.dll");
// Make sure you set performDependencyCheck false
Cef.Initialize(settings, performDependencyCheck: false, browserProcessHandler: null);