2017-01-25 7 views
0

UWP WebViewに表示されている任意のWebサイトから現在選択されているテキストをC#で書かれたUWP Appに取得しようとしています。私はいくつかの方法を試してみましたが、非同期呼び出し: -UWPのWebViewから選択したコンテンツを取得する

return await myWebView.InvokeScriptAsync("eval", new string[] { "return document.getSelection.toString();" }); 

await myWebView.InvokeScriptAsync("eval", new string[] { "document.body.innerHTML = document.getSelection.toString();" }); 

DataPackage data = await web.CaptureSelectedContentToDataPackageAsync(); 
return await data.GetView().GetTextAsync(); 

ぶら下げと無限ループを引き起こしておきます。

私は単純なDOMモデル編集コードをInvokeScriptAsync経由で注入するようにしましたが、document.getSelection()またはwindow.getSelection()を試してしまうと、プログラム全体が永遠にフリーズします。

私はこの記事Windows UWP - WebView get selected Textを見たが、それは私がPCに取り組んでいたとしても、私のために働いているように見えるん。

答えて

0

結局のところ、問題はInvokeScriptAsync()はプロパティとしてURIオブジェクトを有するオブジェクトであるパラメータを有する関数であることを期待するように表示されていることでした。私はこれをやっていた前に(働いていなかったもの):

private async Task<string> GrabSelectedText(WebView web) 
    { 
     try 
     { 
      return await web.InvokeScriptAsync("eval", new string[] { @"window.getSelection().toString();" }); 

     }catch(Exception e) 
     { 
      return "Exception from GrabSelectedText: " + e.Message; 
     } 

    } 

をただし、プロパティとしてウリオブジェクトとオブジェクトの追加のパラメータを追加することによって、(のようなWebViewDOMContentLoadedEventArgsにここで見つける:https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webviewdomcontentloadedeventargs?cs-save-lang=1&cs-lang=csharp#code-snippet-1)。

次のコードは、私が仕事に見つけたものです:

public class MockArgs 
{ 
    private Uri uri; 

    private MockArgs(Uri uri) 
    { 
     this.uri = uri; 
    } 

    public static MockArgs Create(Uri arg) 
    { 
     return new MockArgs(arg); 
    } 
} 

/** This is in a separate class that is able to see the above protected class*/ 
public async void GetSelectedText(WebView sender, MockArgs mockArgs) 
    { 
     var s = await sender.InvokeScriptAsync("eval", new string[] { @"window.getSelection().toString(); " }); 
     Debug.WriteLine("selection retreived"); 
    } 

/** This is called from anywhere that needs to get the selected text from a WebView (that can see the above GetSelectedText() method. */ 
public void TestCode(WebView sender){ 
     GetSelectedText(sender, MockArgs.Create(args.Uri)); 
    } 
0

しかし、私がdocument.getSelection()またはwindow.getSelection()を試すとすぐに、プログラム全体が永遠にフリーズします。

あなたのjsコードが正しくありませんでした。次のコードをテストに使用しました。それはうまくいった。

<WebView x:Name="wv" Source="https://msdn.microsoft.com/en-us/default.aspx"/> 
<Button Content="get selected text" Click="Button_Click"></Button> 
private async void Button_Click(object sender, RoutedEventArgs e) 
{ 
    try 
    { 
     string[] arguments = new string[] { @"window.getSelection().toString();" }; 
     var s = await wv.InvokeScriptAsync("eval", arguments); 
    } 
    catch (Exception ex) 
    { 
     Debug.WriteLine(ex.Message); 
    } 
} 
+0

私は文字通りちょうどあなたがテストするためにそこに置かjavascriptのコードを試みたが、それがないすべてが私にこのメッセージ 与えて、プログラム全体を凍結していますスレッド0x19ccがコード0(0x0)で終了しました。 – lorkaan

+0

@ lorkaanコードサンプル全体を更新しました。確認してください。 –

+0

ありがとう、私はそれを働いて、このスレッドで答えを受け入れた答えとして投稿しました。 InvokeScriptAsyncが呼び出された関数の特定のパラメータと関係していました。 – lorkaan

関連する問題