WPF Cef JS交互

UcCef.xaml

<UserControl x:Class="WpfApp.UcCef"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:cefSharp="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
             xmlns:local="clr-namespace:WpfApp"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Grid x:Name="gdCef">  
            <cefSharp:ChromiumWebBrowser x:Name="cefSharp"></cefSharp:ChromiumWebBrowser>
        <Button Height="30" VerticalAlignment="Bottom" Click="Button_Click">调用js的方法</Button>
        </Grid>
        <Grid x:Name="gdList">
            <ItemsControl ItemsSource="{Binding userList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" x:Name="ictrList">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                            <Border Margin="5,0,5,8" BorderBrush="Black" BorderThickness="1">
                        <StackPanel Orientation="Vertical">
                                <TextBlock Margin="10,8,0,8" Text="{Binding title}" />
                            <TextBlock Text="{Binding authors}" Margin="10,0,0,8" />
                            <TextBlock Text="{Binding img_url}" Margin="10,0,0,8" />
                        </StackPanel>
                            </Border>
                           
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Grid>
    </Grid>
</UserControl>

 

UcCef.xaml.cs

using CefSharp;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;

namespace WpfApp
{
    /// <summary>
    /// UcCef.xaml 的交互逻辑
    /// </summary>
    public partial class UcCef : UserControl
    {
        List<UserModel> userList = new List<UserModel>();
        public UcCef()
        {
            InitializeComponent();

            CefSharpSettings.LegacyJavascriptBindingEnabled = true;

            this.cefSharp.Address = AppDomain.CurrentDomain.BaseDirectory + @"index.html";

            cefSharp.JavascriptObjectRepository.ResolveObject += (s, eve) =>
            {
                var repo = eve.ObjectRepository;
                if (eve.ObjectName == "googleBrower")
                {
                    repo.Register("showTest", new CallbackObjectForJs(), isAsync: true, options: BindingOptions.DefaultBinder);
                }
            };

            //阻止默认行为
            cefSharp.MenuHandler = new MenuHandler();
        }

        public class CallbackObjectForJs
        {

            public string name = "";
            public void showTest(string msg)
            {
                MessageBox.Show(msg);
                MessageBox.Show(name);
            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // cefSharp.ExecuteScriptAsync("ydb1('asdadaasdasdas')");

            Task<CefSharp.JavascriptResponse> t = cefSharp.GetBrowser().MainFrame.EvaluateScriptAsync("ydb1('asdadaasdasdas')");
            // 等待js 方法执行完后,获取返回值

            t.Wait();
            // t.Result 是 CefSharp.JavascriptResponse 对象
            // t.Result.Result 是一个 object 对象,来自js的 callTest2() 方法的返回值
            if (t.Result.Result != null)
            {

                //Json转换需要安装Newtonsoft.Json包
                ResultVoModel<List<UserModel>> resultList = JsonConvert.DeserializeObject<ResultVoModel<List<UserModel>>>(t.Result.Result.ToString());
                userList = resultList.data;
                ictrList.ItemsSource= resultList.data;
                gdCef.Visibility = Visibility.Collapsed;
                gdList.Visibility = Visibility.Visible;
            }
        }
        public class MenuHandler : 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;
            }
        }

        public class UserModel
        {
            public long? id { get; set; }
            public string title { get; set; }
            public string authors { get; set; }
            public string img_url { get; set; }
        }

        public class ResultVoModel<T>
        {
            public int code { get; set; }
            public string message { get; set; }
            public T data { get; set; }
            public bool success { get; set; }
        }
    }
}
 

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1 id="ydb">我是cccsdadsad</h1>
    <script>
        ydb.onclick = function () {
            JsObj.name = "asdsadasdas";

            JsObj.showTest("test");
        }
        function ydb1(msg) {
            alert(msg);
            let thisChart = {
                code: 200,
                message: "成功",
                data:
                    [
                        {
                            "id": 1,
                            "title": "揭开数据真相:从小白到数据分析达人",
                            "authors": "Edward Zaccaro, Daniel Zaccaro",
                            "img_url": "1.svg"
                        },
                        {
                            "id": 2,
                            "title": "Android 高级进阶",
                            "authors": "顾浩鑫",
                            "img_url": "2.svg"
                        },
                        {
                            "id": 3,
                            "title": "淘宝天猫电商运营与数据化选品完全手册",
                            "authors": "老夏",
                            "img_url": "3.svg"
                        },
                        {
                            "id": 4,
                            "title": "大数据架构详解:从数据获取到深度学习",
                            "authors": "朱洁,罗华霖",
                            "img_url": "4.svg"
                        },
                        {
                            "id": 5,
                            "title": "Meteor全栈开发",
                            "authors": "杜亦舒",
                            "img_url": "5.svg"
                        },
                        {
                            "id": 6,
                            "title": "Kubernetes权威指南:从Docker到Kubernetes实践全接触(第2版)",
                            "authors":  "龚正,吴治辉,王伟,崔秀龙,闫健勇",
                            "img_url": "6.svg"
                        }
                    ]
            }
            return JSON.stringify(thisChart);
        }
    </script>
</body>
</html>

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值