VisualElementRenderer中的元素不是我的泛型类型

时间:2017-05-15 21:26:10

标签: ios xamarin.forms wkwebview

我按照示例 - https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/custom-renderer/hybridwebview/创建了一个混合Web视图。它在Andriod项目中工作正常但我在iOS项目中遇到问题。在OnElementChanged重写中,Element属性始终是Xamarin.Forms.Element类型,它是基本类型而不是我的通用视图类型(TElement)。我已多次重新检查我的代码但找不到任何修复程序。如果我下载原始代码并运行它,它工作正常。问题只出现在我的项目中。

任何人都可以指点我为什么不能获得通用的TElement类型。在原始项目中,TElement类型是HybridWebView。我的名字不同,但几乎所有的属性和方法都有。

以下是我的一些代码。复制问题真的很容易。只需创建一个新的Xamarin.Forms解决方案并添加我的代码。你会看到这个谎言的问题 - var ele = Element; //这里的元素不是SBMHybridWebView

PCL中的自定义控件

    public class SBMHybridWebView : Xamarin.Forms.View
{
}

iOS渲染器(我在课程中添加了ExportRenderer)

    public class SBMHybridWebViewRenderer : ViewRenderer<SBMHybridWebView, WKWebView>, IWKScriptMessageHandler
{
    const string JavaScriptFunction = "function invokeCSharpAction(data){window.webkit.messageHandlers.invokeAction.postMessage(data);}";
    WKUserContentController userController;

    protected override void OnElementChanged(ElementChangedEventArgs<SBMHybridWebView> e)
    {
        base.OnElementChanged(e);

        if (Control == null)
        {
            userController = new WKUserContentController();
            var script = new WKUserScript(new NSString(JavaScriptFunction), WKUserScriptInjectionTime.AtDocumentEnd, false);
            userController.AddUserScript(script);
            userController.AddScriptMessageHandler(this, "invokeAction");

            var config = new WKWebViewConfiguration { UserContentController = userController };
            var webView = new WKWebView(Frame, config);
            SetNativeControl(webView);
        }
        if (e.OldElement != null)
        {
            //Clean up code
        }
        if (e.NewElement != null)
        {
            var ele = Element; //ELEMENT HERE IS NOt SBMHybridWebView
        }
    }

    public void DidReceiveScriptMessage(WKUserContentController userContentController, WKScriptMessage message)
    {
        //Element.InvokeAction(message.Body.ToString());
    }
}

XAML

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:localcontrol="clr-namespace:App2.Control;assembly=App2"
             x:Class="App2.View.Page1">
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="*" />
      <RowDefinition Height="60" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <localcontrol:SBMHybridWebView Grid.Row="0" />
  </Grid>
</ContentPage>

1 个答案:

答案 0 :(得分:0)

我找到了我无法解释的原因。在我的iOS项目中,我将我的SBMHybridWebViewRenderer放在Renderer文件夹中。 Somehowm iOS不喜欢渲染器在文件夹中。将它移动到项目的根目录(但保持相同的命名空间)解决了这个问题。为什么?我不知道。无论我把文件放在哪里,我都希望它能够正常工作。

我以为我会发布这个,只是因为别人有同样的问题。