Я пытаюсь создать библиотеку классов Silverlight, которая должна вызывать несколько методов Javascript. Я поместил эти методы в один файл .js и добавил его в проект. Но когда я пытаюсь вызвать любой из методов в js-файле, я получаю ошибку FailedtoInvoke. Я понимаю, что эту проблему можно решить, добавив ссылку на JS-файл в заголовок страницы ASPX или HTML. Но я разрабатываю библиотеку классов, поэтому это невозможно. Кто-нибудь знает, как решить эту проблему? Я использую Silverlight 4 и Visual Studio 2010.
Встраивание файла JS в библиотеку классов Silverlight
Ответы (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
.
Попробуйте что-нибудь вроде:
string myScriptCodeString = GetScriptCodeStringFromSomewhere();
System.Windows.Browser.HtmlPage.Window.Eval(myScriptCodeString);
Тогда должны быть доступны методы, определенные в myScriptCodeString
.
WebClient
и выполнить приведенный выше код в его обратном вызове. Но вы также можете определить это myScriptCodeString
жестко в вашей библиотеке. Однако жестко запрограммированные строки сценария не так хороши, поэтому еще один вариант - изучить функциональность Scriptable Object [msdn.microsoft.com/en-us/library/cc645085 (VS.95) .aspx], если это возможно для вашего сценария.
- person herzmeister; 09.02.2011