2017-01-25 5 views
0

Ich versuche, den aktuell ausgewählten Text von einer beliebigen Website, die in einem UWP-WebView angezeigt wird, an die in C# geschriebene UWP-App zu senden. Ich habe verschiedene Methoden ausprobiert, aber die Async Anrufe: -Get Selected Content Von WebView in UWP

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

,

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

und

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

keep hängen und verursacht eine Endlosschleife.

Ich habe einfachen DOM Model Bearbeitungscode über das InvokeScriptAsync injiziert bekommen, aber sobald ich document.getSelection() oder window.getSelection() versuche, friert das ganze Programm für immer ein.

Ich sah diesen Beitrag Windows UWP - WebView get selected Text, aber das scheint für mich arbeiten, obwohl ich an einem PC arbeite.

Antwort

0

Wie sich herausstellte, war das Problem, dass InvokeScriptAsync() in einer Funktion zu erwarten, erscheint die einen Parameter hat, die ein Objekt mit einem Uri-Objekt als eine Eigenschaft ist. Bevor ich dies tat (was nicht funktionierte):

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

    } 

jedoch durch einen zusätzlichen Parameter eines Objekts Zugabe mit einem Uri-Objekt als eine Eigenschaft (wie in den WebViewDOMContentLoadedEventArgs finden Sie hier: https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webviewdomcontentloadedeventargs?cs-save-lang=1&cs-lang=csharp#code-snippet-1).

Der folgende Code ist das, was ich zur Arbeit gefunden:

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

aber sobald ich document.getSelection() oder window.getSelection() versuche, friert das ganze Programm für immer ein.

Ihre js Code nicht korrekt ist, war habe ich den folgenden Code zu testen. Es hat gut funktioniert.

<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

ich buchstäblich versucht, nur die JavaScript-Code, den Sie dort auf dem Prüfstand und alle es tut, ist das ganze Programm einfrieren, mir diese Nachricht Die Angabe Thread 0x19cc wurde mit Code 0 (0x0) beendet. – lorkaan

+0

@lorkaan Ich habe mein gesamtes Codebeispiel aktualisiert, bitte überprüfen Sie es. –

+0

Danke, ich habe es ausgearbeitet und die Antwort auf diesen Thread als die akzeptierte Antwort geschrieben. Es hatte mit den spezifischen Parametern der Funktion zu tun, in der der InvokeScriptAsync aufgerufen wurde. – lorkaan