如何使用Xamarin.Forms创建仅代码的webview

时间:2017-03-14 22:52:31

标签: xamarin xamarin.forms

我试图使用一个没有.Net SDK的库,但由于我只想用它来返回一个字符串,我想我可以使用它的JS SDK通过创建返回字符串(https://xamarinhelp.com/xamarin-forms-webview-executing-javascript/)的自定义WebView。

我遇到的第一个问题是在将View添加到页面之前不会在Xamarin.Forms中调用CustomRenderer(或者至少我无法调用它)。为了解决这个问题,我在每个平台上添加了对Platform.CreateRenderer的调用。

它完成了技巧并且执行了CustomRenderer。但是当我试图调用一个JS函数来检索字符串时,应用程序只是挂起并保持这种状态。

我没有尝试在页面中插入WebView,因为我希望它独立于应用程序当前所在的页面,因为我想要一个只有代码的#34; HTML,我没有看到将它添加到某处的重点。

我的班级:

JSEvaluator

alert()

UWP渲染器

namespace MyNamespace.Views
{
    public class JSEvaluator : WebView
    {
        public static BindableProperty EvaluateJavascriptProperty = BindableProperty.Create(nameof(EvaluateJavascript), typeof(Func<string, Task<string>>), typeof(JSEvaluator), null, BindingMode.OneWayToSource);

        public Func<string, Task<string>> EvaluateJavascript
        {
            get { return (Func<string, Task<string>>)GetValue(EvaluateJavascriptProperty); }
            set { SetValue(EvaluateJavascriptProperty, value); }
        }

        public JSEvaluator()
        {

        }
    }
}

创建和使用

[assembly: ExportRenderer(typeof(JSEvaluator), typeof(JSEvaluatorRenderer))]
namespace MyNamespace.UWP.Renderers
{
    public class JSEvaluatorRenderer : WebViewRenderer
    {
        public JSEvaluatorRenderer() { }

        protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
        {
            base.OnElementChanged(e);
            var webView = e.NewElement as JSEvaluator;
            if (webView != null)
                webView.EvaluateJavascript = async (js) =>
                {
                    return await Control.InvokeScriptAsync("eval", new[] { js });
                };
        }
    }
}

感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

我必须将WebView添加到页面中,正如@SushiHangover在评论中所说的那样。完成后,它按预期工作。