Bir XBAP'ta BrowserInteropHelper.HostScript'ten erişilemeyen özel işlevler

TWAIN Görüntülerini almak için bir XBAP kullanmaya çalışıyorum ama bu kadar uzağa bile gitmiyorum. BrowserInteropHelper.HostScript'i, ana sayfadaki javascript'e geri dönmeme izin verecek şekilde alamıyorum.

  • XBAP'yi iframe'de çalıştırıyorum.
  • Tam güvene çalıştım (bunun bir zorunluluk olsa da).
  • IE9, .NET Framework 4.0 üzerinde test yapıyorum
  • BrowserInteropHelper.HostScript boş değil, .Close (). gibi normal pencere yöntemlerini kullanabilirim

Kodum şunun gibi görünüyor:

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

Alırım:

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

Yeni bilgi:

Bu senaryo ağdaki diğer bilgisayarlardan düzgün çalışıyor ve nedenini buldum. IE9, varsayılan olarak "Uyumluluk Görünümünde intranet sitelerini görüntüle" olarak adlandırılan bir ayarı vardır. Bu, sayfanın "IE7 modunda" oluşturulmasına neden olur ve JavaScript işlevi XBAP'tan kullanılabilir. Belge Modu'nu tıklatırsam (F12 geliştirici araçları konsolu altında) ve IE9 moduna geçersem artık çalışmaz (yukarıdaki gibi). Kendi bilgisayarımda IE9 modunu varsayılan olarak kullanır (gerektiği gibi) ve manuel olarak IE7 moduna geçmedikçe çalışmaz.

3

6 cevap

IE9'da, size pencere metotları kullanılabilir, bu yüzden setTimeout'u deneyebilirsiniz

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

Bu gerçeğin oldukça uzağında ama bu problemle uğraştığım için çınlamak istedim çünkü çirkin olanı.

Gözlemlediğiniz gibi, çalıştığı makineler uyumluluk modunda çalıştıklarından dolayı çalışır. Aşağıdaki etiketi html belgelerinize ekleyerek IE9'a sayfanızı uyumluluk modunu kullanarak göstermesini sağlayabilirsiniz:

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

Ben bu etiketi ekleyerek tek 'çözüm' olduğunu söyleyerek eminim. Haftaları daha iyi bir şey için harcadım ve hala takılıyorum.

Hangi nedenle olursa olsun, ScriptInteropHelper IE9'daki sorunlarla doludur. Microsoft'tan çok fazla dikkat çekmedi, büyük olasılıkla belirsiz bir işlevsellik. Özellikle, IE7 ve IE8'in her türlü tuhaflığı olduğu için, uyumluluk modunda koşmanız gereken olağanüstü rahatsız edici bir şey. Bir dizi MSDN makalesi vardır, örneğin bu bir tane ve konuyu daha fazla tartışan buradan bağlantı açıklaması girin.

1
katma
Sonunda bir ActiveX tarama kontrolü ile gittim. Çalışır ve uyumluluk modunu kullanmam için beni zorlamıyor (ayrıca, Activex AND npapi sürümüne sahip bir tane buldum. Bu yüzden çoğu tarayıcıda çalışabilir). Görünüşe göre Silverlight hala destekleniyor ama XBAP'ler unutuluyor.
katma yazar Luggage, kaynak
Selam Bagaj, hangi ActiveX kontrolünü seçtiniz?
katma yazar Windy, kaynak

IE9, uyumluluk modunda olmadığı sürece BrowserInteropHelper.HostScript 'i göstermez.

1
katma

IE güvenlik ayarları nedeniyle. IE, yerel sürücüden sayfa açılırsa varsayılan olarak komut dosyalarını engeller. IE, uyarı mesajını "" Güvenliğinizin korunmasına yardımcı olmak için Internet Explorer kısıtlı .... "şeklinde göstermelidir.

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

IE settings

1
katma
Bu seçeneğin kontrol edilmesi işe yaramadı, ancak bazı diğer iş istasyonları üzerinde çalışıyor (Win7/IE9 ve XP/IE8) böylece doğru yolda olabilirsiniz. Keşke PC’nin bunun işe yaramasına neden izin vermediğine dair BAZI göstergesi olması dileğiyle.
katma yazar Luggage, kaynak
Bu seçeneğin, komut dosyaları ARE (ve devam ediyor) çalışması nedeniyle geçerli olduğunu düşünmüyorum. XBAP'den fonksiyonlara erişemiyorum. Hmtl dosyalarını doğrudan dosya://URI'den açarsam komut dosyası uyarıları alıyorum.
katma yazar Luggage, kaynak
Teşekkürler ama bu problemi yaşamıyorum. "Etkin içeriğe izin ver" sorunumda yalnızca uyumluluk modu üzerinde bir etkisi yoktur.
katma yazar Luggage, kaynak
Bunu çözmenin bir başka yolu, webin Mark'ı (MOTW) html sayfasına eklemektir. Bkz. msdn.microsoft.com/en-us/library/ms537628 (v = vs.85) .aspx
katma yazar meetjaydeep, kaynak

Birisi hala bu problem hakkında merak ediyorsa, bir çözüm buldum. Temel olarak belge nesnesinden, en son tarayıcılarda ve HTML5 dokümanı ile herhangi bir bilgisayar korsanlığı olmadan düzgün bir şekilde iletişim kurabilirsiniz.

Kodları ve örnekleri içeren bir blog yazısı yazdım:

IE9 veya daha yeni olan XBAP ve JavaScript - MissingMethodException sorunları için çözüm

Hızla açıkladı bu düzgün çalışır:

JavaScript

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

C # XBAP

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

Daha sonra C# nesnesini Javascript'e geçirmek ve "proxy" nesnesi olarak kullanmak için kullanılabilir. Bunun nasıl kullanılabileceği hakkında ayrıntılı bilgi için blog yayınını kontrol edin.

1
katma
Sadece BrowserInteropHelper.HostScript yerine BrowserInteropHelper.HostScript.document kullanıyor musunuz?
katma yazar Luggage, kaynak
Tam olarak değil. Belge nesnesine genişletme işlevleri, BrowserInteropHelper.HostScript.document aracılığıyla C# den çağrılabilir.
katma yazar Tuukka Lindroos, kaynak

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

onun çalışma ama JS için geri arama fonksiyonları göndermek istiyorsanız setTimeout ile nesne nasıl gönderebilirim?


ie8 için kullanırken onun iyi çalışması

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