Я пытаюсь создать библиотеку классов Silverlight, которая требует вызова нескольких методов Javascript. Я поместил эти методы в один файл .js и добавил его в проект. Но когда я пытаюсь вызвать любой из методов в файле js, я получаю ошибку FailedtoInvoke. Я понимаю, что эту проблему можно решить, добавив ссылку на файл JS в главном разделе ASPX или HTML-страницы. Но я разрабатываю библиотеку классов, и это невозможно. Кто-нибудь знает, как решить эту проблему? Я использую Silverlight 4 и Visual Studio 2010.Внедрение JS-файла в библиотеку классов Silverlight
ответ
Добавить файл .js в вашу библиотеку probject, как это звучит, вы сделали, убедитесь, что Build Action является «Resource».
Вы можете получить этот контент с Application.GetResourceStream
: -
StreamResourceInfo sriJS = Application.GetResourceStream(new Uri("YourAssemblyName;component/MyStuff.js", UriKind.Relative));
Примечания структуры Ури, имя сборки вашей библиотеки классов необходимо следуют буквальному «; компонент». Это говорит Silverlight искать ресурс внутри вашей DLL, который будет включен в Xap конечного приложения.
Теперь вам нужно, чтобы превратить содержание Stream
имущества INfO в в строку: -
StreamReader reader = new StreamReader(sriJS.Stream, System.Text.Encoding.UTF8);
string js = reader.ReadToEnd();
Наконец, вы можете привнести что JavaScript в текущей страницы: -
HtmlPage.Window.Eval(js);
Thats это , любые глобальные функции, определенные в js, теперь могут быть вызваны с помощью HtmlPage.Window.Invoke
.
Попробуйте что-то вроде:
string myScriptCodeString = GetScriptCodeStringFromSomewhere();
System.Windows.Browser.HtmlPage.Window.Eval(myScriptCodeString);
Тогда методы, определенные в myScriptCodeString
должны быть доступны.
Для этого мне нужно разместить мой файл js на моем сервере отдельно, а затем вызвать его здесь правильно? – Harish
Вы можете разместить этот скрипт где-то на сервере и загрузить его async с классом «WebClient» и выполнить вышеуказанный код в своем обратном вызове. Но вы также можете определить, что 'myScriptCodeString' жестко закодирован в вашей библиотеке. Строки с жестким кодом не так хороши, но еще один вариант - посмотреть на функциональность Scriptable Object [http://msdn.microsoft.com/en-us/library/cc645085(VS.95).aspx] если это возможность для вашего сценария. – herzmeister
Спасибо большое! Это сработало! – Harish