WebView.Eval () не работает в веб-представлении Custom Renderer - PullRequest
0 голосов
/ 05 июля 2019

Я последовал примеру xamarin pcl hybridwebview для вызова C # из JavaScript.

Я также хотел бы реализовать функцию для вызова JavaScript из C #.

Iпопытался использовать webview.Eval (script) поверх примера hybridwebview, однако он не запускает JavaScript в веб-просмотре.Я также пробовал веб-просмотр без пользовательского рендера, и он работает нормально.

Невозможно использовать Eval в случае Webview CustomRenderer ..?

Мой CustomerRender:

public class HybridWebView : WebView
{
  Action<string> action;
  public static readonly BindableProperty UriProperty = BindableProperty.Create (
    propertyName: "Uri",
    returnType: typeof(string),
    declaringType: typeof(HybridWebView),
    defaultValue: default(string));

  public string Uri {
    get { return (string)GetValue (UriProperty); }
    set { SetValue (UriProperty, value); }
  }

  public void RegisterAction (Action<string> callback)
  {
    action = callback;
  }

  public void Cleanup ()
  {
    action = null;
  }

  public void InvokeAction (string data)
  {
    if (action == null || data == null) {
      return;
    }
    action.Invoke (data);
  }
}

Вызов Eval в ContentPage:

namespace CustomRenderer
{
    public partial class HybridWebViewPage : ContentPage
    {
        public Func<string, Task<string>> EvaluateJavascript { get; set; }

        public HybridWebViewPage ()
        {
            InitializeComponent ();

            hybridWebView.RegisterAction (data => DisplayAlert ("Alert", "Hello " + data, "OK"));
        }

        private void Button_Clicked(object sender, System.EventArgs e)
        {
            var _Script = string.Format("alert('test')");
            hybridWebView.Eval(_Script);
        }
    }
}

1 Ответ

0 голосов
/ 05 июля 2019

Посмотрите на пользовательский рендер и эту строку

public class HybridWebViewRenderer : ViewRenderer<HybridWebView, Android.Webkit.WebView>

Используемое вами средство визуализации ViewRenderer, а не WebViewRenderer, HybridWebView здесь не является веб-представлением, это просто обычный вид, поэтому функция Eval недопустима.

Обходной путь, о котором я думаю: использовать центр сообщений и выполнять js в настраиваемом рендерере

Форма проекта

private void Button_Clicked(object sender, System.EventArgs e)
    {
        var _Script = string.Format("alert('test')");
        MessagingCenter.Send<object,string>(this,"Hi", _Script);
    }

Custom Renderer

      if (Control == null)
        {
            var webView = new Android.Webkit.WebView(_context);
            webView.Settings.JavaScriptEnabled = true;

            webView.SetWebViewClient(new JavascriptWebViewClient($"javascript: {JavascriptFunction}"));

            ////////////////////////add here 
            webView.SetWebChromeClient(new WebChromeClient());
            MessagingCenter.Subscribe<object, string>(this, "Hi", (obj, arg) =>
            {
                webView.EvaluateJavascript(arg, null);
            });
            ///////////////////////

            SetNativeControl(webView);

        }

Мой тест

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...