使用javascript将一些文本从Xamarin.Forms传递到WebView

使用javascript将一些文本从Xamarin.Forms传递到WebView,javascript,xamarin,xamarin.forms,webview,android-webview,Javascript,Xamarin,Xamarin.forms,Webview,Android Webview,我尝试从xamarin.forms向webView控件发送一些文本。有很多解决方案,我几乎都试过了…;-) 所以实际上它们工作得很好,但是我总是要点击html文件上的一个按钮,我把它加载到这个webView中,我可以把一些文本传递到html文件中。但是我想在不点击这个按钮的情况下传递文本。当webView加载后,文本应该在那里 下面是一些代码: 在xaml.cs中,我加载WebView: protected override void OnAppearing() {

我尝试从xamarin.forms向webView控件发送一些文本。有很多解决方案,我几乎都试过了…;-)

所以实际上它们工作得很好,但是我总是要点击html文件上的一个按钮,我把它加载到这个webView中,我可以把一些文本传递到html文件中。但是我想在不点击这个按钮的情况下传递文本。当webView加载后,文本应该在那里

下面是一些代码:

在xaml.cs中,我加载WebView:

  protected override void OnAppearing()
    {
        base.OnAppearing();

        webViewElement.Source = new HtmlWebViewSource();
        webViewElement.Source = DependencyService.Get<IBaseUrl>().Get();

        webViewElement.RegisterAction(ExecuteActionFromJavascript);

        ExecuteSetFromJavascript();
    }
这是html文件中的函数:

  private async void ExecuteSetFromJavascript()
    {
        var result = "Hello";
        if (result != null)
        {
          var test =  await webViewElement.EvaluateJavaScriptAsync($"updatetextonwebview('{result}')");
        }
    }
  function updatetextonwebview(text) {

                                alert(text);

                                   // document.getElementById("content").innerHTML = text;
                                }
因此,当调用updatetextonwebview时,页面应该发出“Hello”警报

但这并不意味着成功。当我调用这个函数时,可能html页面还没有准备好

有人知道我如何找到解决方案吗


提前感谢…

您想要的是被称为HybridWebView。这意味着它可以接收和发送数据

我发现您提供的代码存在很多不一致和问题-为什么要在OnAppearing中配置WebView,为什么要设置两次源代码,等等

由于提供的代码不够,而且充满了问题和疑问-与其试图找出哪里出了问题,不如按照官方指南从Microsoft创建HybridWebView-

这是可行的,而且您在GitHub中有可用的最终解决方案

如果你还有任何问题,尽管问吧,但我觉得指南非常直截了当

我现在的解决方案是:在HybridWebView中添加了一个属性

使用系统;
使用Xamarin.Forms;
命名空间自定义渲染器
{
公共类HybridWebView:WebView
{
行动;
公共静态只读BindableProperty UriProperty=BindableProperty.Create(
propertyName:“Uri”,
returnType:typeof(字符串),
declaringType:typeof(HybridWebView),
defaultValue:默认值(字符串));
公共静态BindableProperty QuestionProperty=BindableProperty.Create(
propertyName:“问题”,
returnType:typeof(字符串),
declaringType:typeof(HybridWebView),
defaultValue:默认值(字符串));
public static BindableProperty AnswerProperty=BindableProperty.Create(
propertyName:“回答”,
returnType:typeof(字符串),
declaringType:typeof(HybridWebView),
defaultValue:默认值(字符串));
公共字符串Uri
{
获取{return(string)GetValue(UriProperty);}
set{SetValue(UriProperty,value);}
}
公共字符串问题
{
get{return(string)GetValue(QuestionProperty);}
set{SetValue(QuestionProperty,value);}
}
公共字符串应答
{
获取{return(string)GetValue(AnswerProperty);}
set{SetValue(AnswerProperty,value);}
}
公共无效注册表操作(操作回调)
{
动作=回调;
}
公共空间清理()
{
action=null;
}
公共void InvokeAction(字符串数据)
{
if(action==null | | data==null)
{
返回;
}
调用(数据);
}
}
}
我可以在JavaScriptWebViewClient中访问它,并在OnPageFinished上将数据提交到网页

公共类JavascriptWebViewClient:FormsWebViewClient
{
字符串javascript;
字符串问题;
私人字符串(u)应答;;
公共JavascriptWebViewClient(HybridWebViewRenderer渲染器、字符串javascript、字符串问题、字符串答案):基本(渲染器)
{
_javascript=javascript;
_答案=答案;
_问题=问题;
}
公共覆盖无效OnPageFinished(WebView视图,字符串url)
{
base.OnPageFinished(视图、url);
EvaluateJavascript($“阶乘({u-question},{{u-answer})”,null);
EvaluateJavascript(_javascript,null);
}
}

谢谢你的回答,是的,我知道我需要这个HybbridWebView,我知道这个页面来自微软。但问题是,它首先需要一个网页上的互动,你可以发送一些数据给它。我的问题是,如何在没有网页交互的情况下加载网页并提交数据。我想填写一个文本框,该文本框应该在加载页面后填写,而不是在我第一次点击按钮时填写。对不起,我仍然无法理解您的意思。请再次查看示例应用程序-在按下按钮后正在调用代码。yoiu可以自己调用同一个命令,而不是按下按钮。好吧,也许我的眼睛上有西红柿,或者我不知道如何从应用程序调用命令,它将在网页的这个文本框中填充应用程序中的一些文本。