Наконец-то я успешно вызвал функцию из кода C # приложения Silverlight, нажав кнопку Лента.
Вот скриншот окончательного вывода.
Вот что делает PoC
- Существует приложение Silverlight, размещенное в CRM в настраиваемой области-подрайоне. Это в свою очередь требует двух веб-ресурсов
- В ленту добавлена пользовательская кнопка
- Третий веб-ресурс поддерживает функцию JavaScript
- При нажатии кнопки Custom на ленте CRM вызывается функция в веб-ресурсе JavaScript, которая, в свою очередь, вызывает метод в коде C # приложения Silverlight. Строковый ввод передается этому методу
- Метод C # преобразует входную строку в верхний регистр и возвращает ее.
- Наконец, предупреждение отображается в верхнем регистре.
Вот подробности для создания PoC
- Создано новое решение в CRM
Создана новая область и подобласть для этого PoC путем редактирования XML карты сайта. Вот XML, добавленный в customizations.xml.
Добавлена пользовательская кнопка в ленте приложения. Вот обновленный XML для ленты
Последовательность = "101">
Создано приложение Silverlight. Здесь важен код C #.
Примечание
System.Windows.Browser.HtmlPage.RegisterScriptableObject ( "SilverlightCode",
этот); и [ScriptableMember]
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
System.Windows.Browser.HtmlPage.RegisterScriptableObject("SilverlightCode", this);
}
// After the Frame navigates, ensure the HyperlinkButton representing the current page is selected
private void ContentFrame_Navigated(object sender, NavigationEventArgs e)
{
foreach (UIElement child in LinksStackPanel.Children)
{
HyperlinkButton hb = child as HyperlinkButton;
if (hb != null && hb.NavigateUri != null)
{
if (hb.NavigateUri.ToString().Equals(e.Uri.ToString()))
{
VisualStateManager.GoToState(hb, "ActiveLink", true);
}
else
{
VisualStateManager.GoToState(hb, "InactiveLink", true);
}
}
}
}
// If an error occurs during navigation, show an error window
private void ContentFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
{
e.Handled = true;
ChildWindow errorWin = new ErrorWindow(e.Uri);
errorWin.Show();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(CustomMethod("Silverlight Button Clicked !"));
}
//This method will be called from JavaScript on click of Ribbon Button
//This method needs to be Public
[ScriptableMember]
public string CustomMethod(string message = "")
{
//MessageBox.Show(message, "Message", MessageBoxButton.OK);
return message.ToUpper();
}
}
![SLCode](https://i.stack.imgur.com/VH33d.png)
Здесь важен HTML-код.
Обратите внимание на <object id="SLFromJS"
<body>
<form id="form1" runat="server" style="height:100%">
<div id="silverlightControlHost">
<object id="SLFromJS" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="ClientBin/RibbonPoC.xap"/>
<param name="onError" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="4.0.50401.0" />
<param name="autoUpgrade" value="true" />
<a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50401.0" style="text-decoration:none">
<img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/>
</a>
</object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div>
</form>
</body>
Размещенное приложение Silverlight в CRM. Для этого нам нужно создать два веб-ресурса - один для размещения HTML, а второй для XAP.
Создан еще один веб-ресурс для размещения функции JavaScript. Инструменты разработчика (F12) в IE 8 помогли мне найти точное местоположение моего объекта Silverlight (SLFromJS) в HTML DOM. Вот этот JavaScript -
Примечание window.frames ['contentIFrame']. Document.forms ['form1']. SLFromJS;
function CallSilverlightMethod(sender) {
alert('Inside JS1!');
var slc = window.frames['contentIFrame'].document.forms['form1'].SLFromJS;
alert('Inside JS2!');
if (slc != null) {
alert('Inside if!');
alert(slc.Content.SilverlightCode.CustomMethod('Msg From JavaScript'));
alert('Going out of if!');
}
alert('Out of if!');
}
Мое CRM-решение выглядит следующим образом
![CRMSolu](https://i.stack.imgur.com/a6AA2.png)
- Готово! Теперь проверьте работу, открыв ссылку на веб-ресурс HTML.
Благодаря следующим постам в блоге, на которые я ссылался.
http://www.a2zmenu.com/Blogs/Silverlight/Calling-Silverlight-Method-from-JavaScript.aspx
доступ к форме в фрейме