Вызов метода внутри виртуальной машины приложения Silverlight по нажатию кнопки ленты CRM - PullRequest
0 голосов
/ 12 августа 2011

Мы планируем использовать приложение Silverlight MVVM в Dynamics 2011 для нескольких пользовательских функций.Мы также хотим иметь единообразный внешний вид всего приложения для модулей Dynamics и Silverlight.Вот почему мы создаем веб-ресурс для размещения этого приложения Silverlight внутри CRM.

Теперь проблема в том, что нам нужно создать кнопки «Сохранить», «Редактировать» и т. Д. На ленте, которые, в свою очередь, ведут себя как кнопки внутри модуля Silverlight.Ниже приведены важные вопросы

  1. Можем ли мы создать такие кнопки на ленте для доступа к методам внутри приложения View Model of Silverlight, размещенного с помощью «Веб-ресурса».Этим методам также придется получать доступ к изменениям данных, сделанным пользователем в представлениях Silverlight.

  2. Есть ли другой лучший способ справиться с такой ситуацией

Спасибо,

Nilesh

1 Ответ

0 голосов
/ 25 августа 2011

Наконец-то я успешно вызвал функцию из кода C # приложения Silverlight, нажав кнопку Лента.

Вот скриншот окончательного вывода.

OutPut

Вот что делает PoC

  1. Существует приложение Silverlight, размещенное в CRM в настраиваемой области-подрайоне. Это в свою очередь требует двух веб-ресурсов
  2. В ленту добавлена ​​пользовательская кнопка
  3. Третий веб-ресурс поддерживает функцию JavaScript
  4. При нажатии кнопки Custom на ленте CRM вызывается функция в веб-ресурсе JavaScript, которая, в свою очередь, вызывает метод в коде C # приложения Silverlight. Строковый ввод передается этому методу
  5. Метод C # преобразует входную строку в верхний регистр и возвращает ее.
  6. Наконец, предупреждение отображается в верхнем регистре.

Вот подробности для создания PoC

  1. Создано новое решение в CRM
  2. Создана новая область и подобласть для этого PoC путем редактирования XML карты сайта. Вот XML, добавленный в customizations.xml.

  3. Добавлена ​​пользовательская кнопка в ленте приложения. Вот обновленный XML для ленты

    Последовательность = "101">

  4. Создано приложение 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

Здесь важен 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>
  1. Размещенное приложение Silverlight в CRM. Для этого нам нужно создать два веб-ресурса - один для размещения HTML, а второй для XAP.

  2. Создан еще один веб-ресурс для размещения функции 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

  1. Готово! Теперь проверьте работу, открыв ссылку на веб-ресурс HTML.

Благодаря следующим постам в блоге, на которые я ссылался.

http://www.a2zmenu.com/Blogs/Silverlight/Calling-Silverlight-Method-from-JavaScript.aspx

доступ к форме в фрейме

...