天天看點

WPF中使用cefsharp

原文: WPF中使用cefsharp

新入職一家公司,由寫服務端接口變成了軟硬體通信、伺服器、用戶端、C/S、B/S亂七八糟各種打雜。首先接收一個WPF項目,因為不熟WPF,再加上前端我也不熟,我打算使用類似Webapp的方式改造一下,驅使我這樣改造的原因是----我心裡其實是期待着老闆能看在我很忙很累的份上開開恩,招個前端妹子來。

WPF自己的webbrowser控件使用起來經常會js出錯,看網上說可以修改系統資料庫提高wpf預設使用的ie浏覽器版本,最後決定使用cefsharp。

包管理器下載下傳安裝了cefsharp.wpf,沒注意版本。

編譯報錯,提示需要.net 4.5.2以上版本,目前程式使用的是.net 4.0,編譯器為vs2013。

工程右鍵->屬性->目标架構,下拉最高隻有.net 4.5.1,下載下傳.net 4.5.2 Developer Pack安裝。

準備工作結束,直接上代碼

準備html

<html>
<head>
    <meta charset="utf-8">
    <link href="css/bootstrap.min.css?v=3.4.0" rel="stylesheet">

    <script language="JavaScript" type="text/javascript">
        function Selec()
        {
            bound.MyMethod();
        }
    </script>
</head>
<body  oncontextmenu='return false' onselectstart='return false'>

    <input type="text" class="form-control"> <span class="help-block m-b-none">部門清單</span>
            <input type="submit" value="儲存" onclick="Selec()">
</body>
</html>             

xaml布局檔案不需要改動,相應cs檔案

在構造函數中加入

//var browser = new CefSharp.Wpf.ChromiumWebBrowser();
this.Content = browser;
browser.Address = @"c:/html/Department.html";//檔案路徑
browser.RegisterJsObject("bound", new BoundObject(), new CefSharp.BindingOptions { CamelCaseJavascriptNames = false });//次函數有對應異步方法(RegisterAsyncJsObject),差別和使用場景沒仔細看           

在定義一個類供js調用的c#方法

public class BoundObject
        {
            public void MyMethod()
            {
                MessageBox.Show("success");
            }
      
}           

new CefSharp.BindingOptions { CamelCaseJavascriptNames = false }參數區分大小寫。

好了,啟動點選儲存,彈出了了對話框。

還可以在xaml中使用

xmlns:cefSharp="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
             d:DesignHeight="900" d:DesignWidth="1240">
    <Grid>
        <cefSharp:ChromiumWebBrowser Name="mychrome" Height="900" Width="1240"/>

    </Grid>           

對應cs檔案中作相應更改

var browser = new CefSharp.Wpf.ChromiumWebBrowser();
            mychrome = browser;
            browser.Address = CGlobal.InstallPath + "html/Department.html";
            browser.RegisterAsyncJsObject("bound", new BoundObject(), new CefSharp.BindingOptions { CamelCaseJavascriptNames = false }); //Standard object rego           

完善:

禁用右鍵 方法1

cs檔案中加入

browser.MenuHandler = new MenuHandler();      

MenuHandler繼承自接口IContextMenuHandler

public class MenuHandler : CefSharp.IContextMenuHandler
        {
            public void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model)
            {
                model.Clear();
            }
            public bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags)
            {
                return false;
            }
            public void OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame)
            {
                
            }
            public bool RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback)
            {
                return false;
            }
        }           

方法2:修改HTML檔案

<body  oncontextmenu='return false'>           

禁止滑鼠選中:

<body oncontextmenu='return false' onselectstart='return false'>           

詳情參考:https://github.com/cefsharp/CefSharp/wiki

繼續閱讀