天天看點

如何用Web技術開發Windows Form應用

現在H5很熱,很多網際網路公司的産品都采用混合程式設計,其中各個平台用戶端的“殼”為原生控件,但是内容很多都是Web網頁,是以可以做出很多炫酷的效果。随着Node.js和Ionic等架構的出現,現在感覺JavaScript有一統Web、Mobile、PC三大平台應用開發的能力。在Windows Form 上,利用開源浏覽器核心Chromium Embedded Framework (CEF),CEF可以實作C#調用JS,JS調用C#,可以很好的與Web進行應用互動。下面用一個簡單的例子來說明。

1 項目庫

建立一個Windows Form項目,并用NuGet包管理器下載下傳需要的庫cefsharp,具體如下圖所示:

如何用Web技術開發Windows Form應用

注意:cefsharp必須生成32或者64位的應用程式,這裡請自行配置。

2 代碼實作

  為了界面好看,這裡用到一個MaterialSkin架構來美化UI,可以利用同樣的方法進行下載下傳。由于此處用到了MaterialSkin庫,它會将窗體的邊框隐藏,并自行實作了一個窗體邊框。如果直接将ChromiumWebBrowser控件執行個體化後添加到窗體上,會出現顯示不全的問題。為了解決這個問題,在窗體上放入一個panel,調整到合适大小,将ChromiumWebBrowser控件執行個體化後添加到panel中即可。示例核心代碼如下所示:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
using MaterialSkin;
using MaterialSkin.Controls;
namespace cefWinForm
{
    public partial class Form1:MaterialForm
    {
        private ChromiumWebBrowser myBrowser = null;
        public Form1()
        {
            InitializeComponent();
            ChromeDevToolsSystemMenu.CreateSysMenu(this);
            var materialSkinManager = MaterialSkinManager.Instance;
            materialSkinManager.AddFormToManage(this);
            materialSkinManager.Theme = MaterialSkinManager.Themes.LIGHT;
            materialSkinManager.ColorScheme =
                new ColorScheme(Primary.BlueGrey800, Primary.BlueGrey900, Primary.BlueGrey500, Accent.LightBlue200, TextShade.WHITE);

        }
        //Note: The function calls Cef.Initialize(); and Cef.Shutdown();
        //only need to be called once in the application.
        private void Form1_Load(object sender, EventArgs e)
        {
            Cef.Initialize();
            myBrowser = new ChromiumWebBrowser("http://127.0.0.1/");
            myBrowser.BrowserSettings.DefaultFontSize = 12;
            //myBrowser.BrowserSettings.AcceptLanguageList = "zh-CN,en-US";
            // this.Controls.Add(myBrowser);
            this.pcontainer.Controls.Add(myBrowser);

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //在退出主程式時,需要首先關閉Cef
            Cef.Shutdown();
        }

        private void devToolsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (myBrowser != null)
            {
                //開發者工具
                myBrowser.ShowDevTools();
            }
        }

        private void devToolsToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            if (myBrowser != null)
            {
                myBrowser.ShowDevTools();
            }
        }

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            // Test if the About item was selected from the system menu
            if ((m.Msg == ChromeDevToolsSystemMenu.WM_SYSCOMMAND) &&
               ((int)m.WParam == ChromeDevToolsSystemMenu.SYSMENU_CHROME_DEV_TOOLS))
            {
                myBrowser.ShowDevTools();
            }
        }
    }
}      

這裡用new ChromiumWebBrowser("http://127.0.0.1/")建立了一個基于Chromium的WebBrowser,位址為

http://127.0.0.1/

,這樣就相當于本地的一個浏覽器。基于H5建立的程式,有一個天然的好處就是,程式的更新可以在伺服器端完成,用戶端無需更新,即可完成功能的疊代。另外,就是基于CEF架構,内置的浏覽器版本,相對可控,這樣也從另一方面,解決了傳統Web應用相容多種浏覽器的相關問題。

3 效果

運作此示例,相關界面如下所示:

如何用Web技術開發Windows Form應用

繼續閱讀