Aangepaste functies niet beschikbaar vanuit BrowserInteropHelper.HostScript in een XBAP

Ik probeer een XBAP te gebruiken om TWAIN-afbeeldingen te verkrijgen, maar ik kom niet eens zover. Ik kan het BrowserInteropHelper.HostScript schijnbaar niet krijgen om me in staat te stellen terug te praten met het JavaScript op de hostpagina.

  • Ik gebruik de XBAP in een iframe.
  • Ik heb geprobeerd volledig te vertrouwen (hoewel dat een vereiste zou moeten zijn).
  • Ik test op IE9, .NET Framework 4.0
  • Het BrowserInteropHelper.HostScript is niet leeg, ik kan de normale venstermethoden gebruiken, zoals .Close ().

Mijn code ziet er als volgt uit:

index.html:


My cat's breath smells like cat food.

<script type="text/javascript"> function WorkDamnit() { $('#someP').hide(); } </script> <iframe src="@Url.Content("~/XBAPs/WPFBrowserApplication1.xbap")" style="border: none;" width="500" height="500" />

Page1.xaml.cs:

private void Button_Click(object sender, RoutedEventArgs e)
{
    if (BrowserInteropHelper.HostScript == null)
        throw new ApplicationException("hostscript is null");
    else
        BrowserInteropHelper.HostScript.WorkDamnit();
}

Ik krijg:

System.MissingMethodException: Method '[object Window].WorkDamnit' not found.

Nieuwe informatie:

Dit scenario werkt goed vanaf andere pc's in het netwerk en ik ontdekte waarom. IE9 heeft standaard een instelling ingeschakeld met de naam "Intranet-sites weergeven in compatibiliteitsweergave". Hierdoor wordt de pagina weergegeven in "IE7-modus" en is de JavaScript-functie beschikbaar vanaf XBAP. Als ik op Document Mode: klik (onder de console F12 Developer Tools) en schakel over naar IE9-modus, dan werkt het niet meer (zoals hierboven). Op mijn eigen pc gebruikt het standaard de IE9-modus (zoals het hoort) en het werkt niet, tenzij ik handmatig overschakel naar de IE7-modus.

3

6 antwoord

In IE9 zijn venstermethoden voor u beschikbaar, dus u kunt setTimeout proberen

BrowserInteropHelper.HostScript.setTimeout("WorkDamnit()",0);
3
toegevoegd

Dit is vrij ver na het feit, maar ik wilde me aanmoedigen omdat ik dit probleem heb aangepakt en het is een lelijke.

Zoals je hebt gezien, werken de machines waarop het draait, omdat ze in de compatibiliteitsmodus werken. U kunt IE9 opdracht geven uw pagina weer te geven met de compatibiliteitsmodus door de volgende tag toe te voegen aan uw html-documenten:

<meta http-equiv="X-UA-Compatible" content="IE=8"/>

Ik heb er alle vertrouwen in dat het toevoegen van deze tag uw enige 'oplossing' is. Ik heb weken doorgebracht met het zoeken naar een betere en dit is degene waar ik nog steeds mee bezig ben.

Om welke reden dan ook is de ScriptInteropHelper vol met problemen in IE9. Het heeft niet veel aandacht van Microsoft gekregen, waarschijnlijk omdat het een obscure functionaliteit is. Dat gezegd hebbende, vooral omdat IE7 en IE8 allerlei eigenaardigheden hebben, het is buitengewoon vervelend dat je in compatibiliteitsmodus moet werken. Er zijn een aantal MSDN-artikelen, bijvoorbeeld deze en geef hier een linkbeschrijving op die het probleem verder bespreekt.

1
toegevoegd
Uiteindelijk ging ik met een ActiveX-scanbesturing. Het werkt en dwingt me niet om de compatibiliteitsmodus te gebruiken (ik heb er ook een gevonden met een actievex EN npapi-versie dus het kan in de meeste browsers werken). Het lijkt erop dat Silverlight nog steeds wordt ondersteund, maar XBAP's zijn vergeten.
toegevoegd de auteur Luggage, de bron
Hallo bagage, mag ik weten welk ActiveX-besturingselement u hebt gekozen?
toegevoegd de auteur Windy, de bron

IE9 stelt BrowserInteropHelper.HostScript niet bloot tenzij deze zich in compatibiliteitsmodus bevindt.

1
toegevoegd

Het is te wijten aan IE-beveiligingsinstellingen. IE blokkeert standaard de scripts als de pagina wordt geopend vanaf het lokale station. IE zou het waarschuwingsbericht moeten weergeven als "'Om uw veiligheid te helpen beschermen, heeft Internet Explorer beperkt ..."

However you can change the settings
Check the checkbox "Allow active content to run in files on My Computer"

IE settings

1
toegevoegd
Het aanvinken van deze optie werkte niet, maar het werkt hier op een aantal andere werkstations (Win7/IE9 en XP/IE8), dus je bent misschien op de goede weg. Ik zou willen dat er een ENKELE indicatie was op mijn pc waarom dit niet zou werken.
toegevoegd de auteur Luggage, de bron
Ik denk niet dat die optie van toepassing is, omdat scripts ZIJN (en zijn) uitgevoerd. Ik kan gewoon geen toegang krijgen tot de functies van de XBAP. Ik krijg wel scriptwaarschuwingen als ik hmtl-bestanden rechtstreeks vanuit bestand://URI open.
toegevoegd de auteur Luggage, de bron
Bedankt maar ik ondervind dit probleem niet. De "actieve inhoud toestaan" heeft geen effect op mijn probleem, alleen compatibiliteitsmodus.
toegevoegd de auteur Luggage, de bron
Een andere manier om dit op te lossen, is door Mark of the web (MOTW) toe te voegen op de html-pagina msdn.microsoft.com/en-us/library/ms537628 (v = vs.85) .aspx
toegevoegd de auteur meetjaydeep, de bron

Als iemand zich nog steeds afvraagt ​​over dit probleem, kwam ik een oplossing te weten. In principe kunt u vanuit document-object goed communiceren zonder hacks in de nieuwste browsers en met HTML5-doctype.

Ik schreef een blogpost met de codes en voorbeelden:

XBAP en Javascript met IE9 of nieuwer - Oplossing voor problemen met MissingMethodException

Snel uitgelegd dat dit goed werkt:

Javascript

document.ResponseData = function (responseData) {
    alert(responseData);
}

C # XBAP

var hostScript = BrowserInteropHelper.HostScript;
hostScript.document.ResponseData("Hello World");

Het kan dan worden gebruikt om het C# -object door te geven aan Javascript en te gebruiken als "proxy" -object. Controleer dat blogbericht voor details over hoe dat kan worden gebruikt.

1
toegevoegd
Wilt u zeggen dat u BrowserInteropHelper.HostScript.document moet gebruiken in plaats van alleen BrowserInteropHelper.HostScript ?
toegevoegd de auteur Luggage, de bron
Niet precies. Uitbreiding van functies naar documentobject kan worden aangeroepen vanuit C# via BrowserInteropHelper.HostScript.document.
toegevoegd de auteur Tuukka Lindroos, de bron

BrowserInteropHelper.HostScript.setTimeout ( "WorkDamnit ()", 0);

het werkt, maar als ik callback-functies naar JS wil verzenden, hoe kan ik dan een object met setTimeout verzenden?


bij gebruik voor ie8 het werkt goed

dynamic host = BrowserInteropHelper.HostScript;
host.sampleJSFunction(new CallbackObject(this));
0
toegevoegd