0

私はクロスプラットフォームのxamarinフォームアプリケーションを開発しています。ポータブルクロスプラットフォームアプリケーションを作成しました。私はwebviewでローカルhtmlページを開こうとしています。 angularjsからC#関数を呼び出すために、私はハイブリッドWebビューの概念を実装しました。Xamarin FormsのAngularJsスクリプトからC#関数を呼び出すPCLユニバーサルWindowsアプリケーション

私angularjsは、私はデータベースと通信するためにCommInterfaceクラスを使用していますAndroidのプロジェクトに好きなように

$scope.SyncServerJobs = function() { 
    //$scope.loadActList(); 
    window.CommInterface.syncServerJobs(""); 
} 
マイユニバーサルWindowsのプロジェクトで

public class HybridWebViewRenderer : ViewRenderer<HybridWebView, Windows.UI.Xaml.Controls.WebView> 
{ 
    public CommInterface communicator = new CommInterface(); 

    const string JavaScriptFunction = "function invokeCSharpAction(data){window.external.notify(data);}"; 
    const string SyncServerJobs = "function syncServerJobs(data){window.external.notify(data);}"; 

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

     if (Control == null) 
     { 
      var webView = new WebView(); 
      webView.Settings.IsJavaScriptEnabled = true; 
      SetNativeControl(webView); 
     } 
     if (e.OldElement != null) 
     { 
      Control.NavigationStarting -= OnWebViewNavigationStarted; 
      Control.NavigationCompleted -= OnWebViewNavigationCompleted; 
      Control.ScriptNotify -= OnWebViewScriptNotify; 
     } 
     if (e.NewElement != null) 
     { 
      Control.NavigationStarting += OnWebViewNavigationStarted; 
      Control.NavigationCompleted += OnWebViewNavigationCompleted; 
      Control.ScriptNotify += OnWebViewScriptNotify; 
      Control.Source = new Uri(string.Format("ms-appx-web:///Content//{0}", Element.Uri)); 
     } 
    } 

    private void OnWebViewNavigationStarted(WebView sender, WebViewNavigationStartingEventArgs args) 
    { 
     if (Control != null && Element != null) 
     { 
      communicator = new CommInterface(); 
      Control.AddWebAllowedObject("CommInterface", communicator); 
     } 
    } 

    async void OnWebViewNavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args) 
    { 
     if (args.IsSuccess) 
     { 
      // Inject JS script 
      await Control.InvokeScriptAsync("eval", new[] { JavaScriptFunction }); 
      await Control.InvokeScriptAsync("eval", new[] { SyncServerJobs }); 
     } 
    } 

    void OnWebViewScriptNotify(object sender, NotifyEventArgs e) 
    { 
     Element.InvokeAction(e.Value); 
    } 
} 

マイcommInterfaceクラス

[AllowForWeb] 
public sealed class CommInterface 
{ 
    readonly WeakReference<HybridWebViewRenderer> hybridWebViewRenderer; 

    public CommInterface() 
    { 

    } 

    public void syncServerJobs(string data) 
    { 
     HybridWebViewRenderer hybridRenderer; 
     if (hybridWebViewRenderer != null && hybridWebViewRenderer.TryGetTarget(out hybridRenderer)) 
     { 
      hybridRenderer.Element.SyncServerJobs(data); 
     } 
    } 
} 

ファンクションポータブルライブラリのクラス。しかし、ユニバーサルWindowsプロジェクトでは、CSHARP CRUD機能を実行するためにCsharp関数と通信することができません。だから私の問題を一度見て、スクリプトからCSharp関数を呼び出すのを助けてください。どんな助けでもあなたにとても感謝します。

答えて

0

私はCSharp CRUD機能を実行するためにCsharp関数と通信できません。だから私の問題を一度見て、スクリプトからCSharp関数を呼び出すのを助けてください。

webViewナビゲーション完了後にJSスクリプトを入力しました。つまりawait Control.InvokeScriptAsync("eval", new[] { JavaScriptFunction });JSスコープで宣言されました。

ウェブビューのコンテンツのスクリプトでは、window.external.notifyに文字列パラメータを使用すると、アプリに情報を送り返すことができます。これらのメッセージを受信するには、ScriptNotifyイベントを処理します。

だからScriptNotifyイベントは、次のコードのようにJSスコープでJavaScriptFunctionを実行するとトリガーされます。

<button type="button" onclick="javascript:invokeCSCode($('#name').val());">Invoke C# Code</button> 
<br/> 
<p id="result">Result:</p> 
<script type="text/javascript"> 
function log(str) 
{ 
    $('#result').text($('#result').text() + " " + str); 
} 

function invokeCSCode(data) { 
    try { 
     log("Sending Data:" + data); 
     invokeCSharpAction(data);  
    } 
    catch (err){ 
     log(err); 
    } 
} 

私はあなたがだから私はあなたがハイブリッドWeb表示用InvokeActionを宣言したことを推測excuted Element.InvokeAction(e.Value);ScriptNotifyイベントを処理していました。

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); 
} 

次に、次のコードのようにコールバック関数でCSharp CRUD関数を処理できます。

smbridwebview.RegisterAction(data => { 
// process CSharp CRUD functions 
}); 
関連する問題