2009-06-12 18 views
7

Sto avendo un momento divertente che consente a Silverlight e JavaScript di comunicare tra loro.Comunicazione Silverlight e JavaScript

Nel file page.xaml.cs, ho segnato la classe come ScriptableType e due metodi con ScriptableMember. Poi dichiarato:

HtmlPage.RegisterScriptableObject("Page", this); 

Quando si tenta di richiamare un metodo, ottengo obj.Content.Page non definita:

var obj = document.getElementById('silverlightControl'); 
alert(obj);    // [object HtmlObjectElement] 
alert(obj.Content);  // Content 
alert(obj.Content.Page); // obj.Content.Page is undefined 
alert(obj.Content.Page.GetRegion()); 

Dall'altro lato, all'interno di un metodo in Page.xaml. cs, sto chiamando:

HtmlPage.Window.Invoke("mapRegionChanged", GetRegion()); 

ho un relativo metodo in JavaScript, che non viene mai chiamato:

function mapRegionChanged(region) { 
    alert("Region changed: " + region); 
} 

L'oggetto Silverlight è dichiarato come segue:

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" 
    width="151px" height="77px" id="silverlightControl"> 
    <param name="onload" value="regionsLoaded" /> 
    <param name="source" value="<%= Url.Content("~/ClientBin/Worldmap.xap") %>" /> 
    <param name="onerror" value="onSilverlightError" /> 
    <param name="background" value="white" /> 
    <param name="minRuntimeVersion" value="2.0.31005.0" /> 
    <param name="autoUpgrade" value="true" /> 
    <param name="enableHtmlAccess" value="true" /> 
    <a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;"> 
     <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" /> 
    </a> 
</object> 

L'UserControl è definito in XAML come:

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
x:Class="Worldmap.Page" 
Width="151" Height="77" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> 
<Grid x:Name="LayoutRoot" Background="White" Width="151" Height="77" Cursor="Hand" MouseMove="OnMouseMove" MouseLeftButtonUp="OnMouseUp" MouseLeave="OnMouseLeave"> 
+0

Beh, a quanto pare funziona in IE7, non solo in Firefox 3.0.5. Pensavo che avessimo superato le guerre tra browser con Silverlight? –

+0

Si vede un errore nella console javascript? – russau

+0

No, nessun errore nella console degli errori. –

risposta

0

Se hai trovato qualche incompatibilità tra Firefox e IE, avremo bisogno di segnalarlo . Potrebbe essere qualcos'altro nel JS sulla pagina, o potrebbe essere un'impostazione in FF3 (come materiale di tipo flashblock)

1

Ho riscontrato questo problema. Firefox è il mio browser predefinito ed è quindi il browser che Visual Studio (in realtà VWD, ma non importa) si avvia. Durante lo sviluppo, ho aggiunto il codice di chiamata JavaScript alla pagina del client e ho scoperto che il componente figlio "contenuto" del componente Silverlight non poteva essere trovato nel DOM in FireFox, ma potrebbe essere trovato in IE. Ho riavviato i server Web di Visual Studio (quelli nella barra delle applicazioni) e ciao, presto - ha funzionato in Firefox! Il problema sembra essere stato causato dalla memorizzazione nella cache del componente Silverlight in quei server Web.

+2

Io uso la barra degli strumenti di sviluppo Web per disabilitare la cache in Firefox quando si lavora su progetti Silverlight. Ho sempre problemi con il caching altrimenti. – ChadT

0

Alcuni giorni fa ho letto la rivista php architect e c'è un articolo su Silverlight che spiega come comunicare con javascript, si potrebbe voler controllare.

Vai a http://www.phparch.com e registri in modo da poter scaricare la rivista, allora è necessario scaricare il numero di maggio 2009, tutte le altre questioni devono essere pagati, ma questo nel mio conto era libero, spero nella tua troppo, se si puo' t scaricalo fammelo sapere e posso inviarti il ​​PDF via email.

E qui è il link diretto per scaricare il programma: https://store-phpa.phparch.com/c/phpa/magazine/pickup/97

Con i migliori saluti, Alexandru

1

Assicurati di consentire accesso HTML:

in C#:

 System.Windows.Interop.SilverlightHost host = Application.Current.Host; 
     System.Windows.Interop.Settings settings = host.Settings; 

     bool enableAcces = settings.EnableHTMLAccess; 
     enableAcces = true; 

in HTML:

<param name="enablehtmlaccess" value="true" /> 

Questo ha funzionato per me.