Можно ли отправить сообщение из приложения WPF, в котором размещен элемент управления CefSharp, в веб-приложение, работающее на CefSharp, как это может сделать WebView2

#wpf #cefsharp #webview2

Вопрос:

С помощью WebVeiw2 вы можете отправить сообщение веб-приложению, запущенному в нем, с помощью WebView2Ctrl?.CoreWebView2?.PostWebMessageAsJson(сообщение). Есть ли способ сделать это в CefSharp

Комментарии:

1. Есть несколько способов общения со своей стороны . Сетевое приложение для браузера, просто выполняющее JavaScript, используя обратный вызов ijavascript. Не могли бы вы рассказать немного подробнее о своем варианте использования? Недд, чтобы узнать больше, прежде чем я смогу предложить, какой подход, скорее всего, лучше всего соответствует вашим требованиям.

2. В качестве общей справки github.com/cefsharp/CefSharp/wiki/…

Ответ №1:

  1. Создайте класс (я использовал JavascriptCallbackMessenger) для установки и запуска обратных вызовов.

    общедоступный класс JavascriptCallbackMessenger { частный IJavascriptCallback _ обратный вызов;

     public void SetCallBack(IJavascriptCallback callback)
    {
        _callback = callback;
    }
    
    public void RunCallback(string message)
    {
        if (_callback != null amp;amp; _callback.CanExecute)
        {
            _callback.ExecuteAsync(message);
        }
    }
     

    }

  2. Создайте экземпляр JavascriptCallbackMessenger и зарегистрируйте его в элементе управления CefSharp

    CefSharpCtrl.JavascriptObjectRepository.Register(имя JavascriptCallbackMessengerName, _messenger, true, BindingOptions.Привязка по умолчанию);

  3. Установите обратный вызов в Javascript следующим образом (я не разработчик JS, но это было мое решение).

    (асинхронная функция() { const CefSharp = (окно как любое).CefSharp;

     await cefSharp.BindObjectAsync(JavascriptCallbackMessengerName);
    
    window.javascriptCallbackMessenger.setCallBack(function(message: string) 
    {
        console.log("messageHandler: "   message);
    })
     

    })();

Я использовал typescript, поэтому мне пришлось расширить окно с помощью недавно созданной переменной.

 declare global {
  interface Window { javascriptCallbackMessenger: any; }
}
 

Извините, но форматирование, кажется, немного «не в порядке»!

Комментарии:

1. Вы можете использовать CefSharp.postMessage в JavaScript и избежать регистрации класса, если все, что вы делаете, — это передача обратного вызова. github.com/cefsharp/CefSharp/wiki/…

2. Также EvaluateScriptAsync может возвращать обратный вызов ijavascript, поэтому вы можете выполнить некоторые JavaScript со своего . Сетевое приложение, чтобы получить ссылку на функцию JavaScript. github.com/cefsharp/CefSharp/wiki/… в последнем примере захватывается щелчок кнопки, то же самое можно использовать для основной функции.