Встраивание файла JS в библиотеку классов Silverlight

Я пытаюсь создать библиотеку классов Silverlight, которая должна вызывать несколько методов Javascript. Я поместил эти методы в один файл .js и добавил его в проект. Но когда я пытаюсь вызвать любой из методов в js-файле, я получаю ошибку FailedtoInvoke. Я понимаю, что эту проблему можно решить, добавив ссылку на JS-файл в заголовок страницы ASPX или HTML. Но я разрабатываю библиотеку классов, поэтому это невозможно. Кто-нибудь знает, как решить эту проблему? Я использую Silverlight 4 и Visual Studio 2010.


person Harish    schedule 09.02.2011    source источник


Ответы (2)


Добавьте файл .js в вашу библиотеку, как вам кажется, вы уже сделали, убедитесь, что для действия сборки установлено значение «Resource».

Вы можете получить этот контент с помощью Application.GetResourceStream: -

StreamResourceInfo sriJS = Application.GetResourceStream(new Uri("YourAssemblyName;component/MyStuff.js", UriKind.Relative));

Обратите внимание на структуру Uri: необходимо указать имя сборки вашей библиотеки классов, за которым следует литерал «; component». Это указывает Silverlight искать ресурс внутри вашей dll, который будет включен в Xap окончательного приложения.

Теперь вам нужно превратить содержимое свойства info Stream в строку: -

StreamReader reader = new StreamReader(sriJS.Stream, System.Text.Encoding.UTF8);
string js = reader.ReadToEnd();

Наконец, вы можете вставить этот javascript на текущую страницу с помощью: -

HtmlPage.Window.Eval(js);

Вот и все, любые глобальные функции, определенные в js, теперь можно вызывать с помощью HtmlPage.Window.Invoke.

person AnthonyWJones    schedule 09.02.2011

Попробуйте что-нибудь вроде:

string myScriptCodeString = GetScriptCodeStringFromSomewhere();
System.Windows.Browser.HtmlPage.Window.Eval(myScriptCodeString);

Тогда должны быть доступны методы, определенные в myScriptCodeString.

person herzmeister    schedule 09.02.2011
comment
Чтобы это сработало, мне нужно разместить свой js-файл на моем сервере отдельно, а затем называть его здесь, верно? - person Harish; 09.02.2011
comment
Вы можете разместить этот сценарий где-нибудь на сервере, загрузить его асинхронно с классом WebClient и выполнить приведенный выше код в его обратном вызове. Но вы также можете определить это myScriptCodeString жестко в вашей библиотеке. Однако жестко запрограммированные строки сценария не так хороши, поэтому еще один вариант - изучить функциональность Scriptable Object [msdn.microsoft.com/en-us/library/cc645085 (VS.95) .aspx], если это возможно для вашего сценария. - person herzmeister; 09.02.2011