例 - https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/custom-renderer/hybridwebview/を実行してハイブリッドWebビューを作成しました。 Andriodプロジェクトでうまく動作しますが、iOSプロジェクトに問題があります。 OnElementChangedのオーバーライドでは、Elementプロパティは常にXamarin.Forms.Elementタイプであり、これは基本タイプであり、一般的なビュータイプ(TElement)ではありません。コードを何度も再チェックしましたが、修正が見つかりません。元のコードをダウンロードして実行すると、正常に動作します。問題は私のプロジェクトだけです。VisualElementRendererの要素は、汎用タイプではありません
私は一般的なTElement型を取得していない可能性がありますので、誰でも私にポインタを教えてください。元のプロジェクトでは、TElementタイプはHybridWebViewです。私の場合、私は別の名前を持っていますが、ほとんどすべて同じプロパティとメソッドを持っています。
以下は私のコードです。問題を再現するのは本当に簡単です。新しいXamarin.Formsソリューションを作成してコードを追加するだけです。あなたはこの嘘の問題を見るでしょう - var ele = Element; //ここELEMENTはPCLに
カスタムコントロールをSBMHybridWebViewされていない
iOSのレンダラは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>
public class SBMHybridWebView : Xamarin.Forms.View
{
}
コードに関連する部分を質問に追加します。それ以上の情報なしで助けることは非常に困難です。 –
投稿を編集しました – Amitesh