单击CRM Ribbon按钮,在Silverlight应用程序的VM内调用方法

时间:2011-08-12 08:55:32

标签: silverlight-4.0 mvvm dynamics-crm-2011 ribbon-control

我们计划在Dynamics 2011中使用Silverlight MVVM应用程序以获得少量自定义功能。我们还希望为Dynamics和Silverlight模块提供一致的整体应用程序外观。这就是我们创建Web资源以在CRM中托管此Silverlight应用程序的原因。

现在问题是我们需要在功能区中创建“保存”,“编辑”等按钮,这反过来就像Silverlight模块中的按钮一样。以下是重要问题

  1. 我们可以在Ribbon中创建这样的按钮来访问使用“Web资源”托管的Silverlight应用程序的View Model中的方法。这些方法还必须访问用户在Silverlight Views中完成的数据更改。

  2. 还有其他更好的方法来处理这种情况

  3. 谢谢,

    Nilesh制作

1 个答案:

答案 0 :(得分:0)

最后,我从Ribbon按钮单击成功调用了Silverlight应用程序的C#代码中的函数。

以下是最终输出的屏幕截图。

OutPut

这是PoC正在做的事情

  1. 在自定义区域分区的CRM中托管了Silverlight应用程序。这又需要两个网络资源
  2. 功能区
  3. 中添加了自定义按钮
  4. 第三个网络资源正在托管JavaScript功能
  5. 单击CRM上的自定义按钮功能区调用JavaScript Web资源,然后调用Silverlight应用程序的C#代码中的方法。字符串输入传递给此方法
  6. C#方法是将输入字符串转换为大写并返回它。
  7. 最后以大写字符串显示警告。
  8. 以下是创建PoC的详细信息

    1. 在CRM中创建新解决方案
    2. 通过编辑站点地图XML为此PoC创建新的区域和子区域。以下是customizations.xml中添加的XML。

                                         

    3. 在应用程序功能区中添加了自定义按钮。这是更新的Ribbon for Ribbon

                                      序列= “101” >                                                                                                                                                                                                                                                                   

    4. 创建Silverlight应用程序。这是重要的C#代码。

    5.   

      请注意   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. 在CRM中托管Silverlight应用程序。为此,我们需要创建两个Web资源 - 一个用于托管HTML,另一个用于XAP。

      2. 再创建一个Web资源来托管JavaScript函数。 IE 8中的开发人员工具(F12)帮助我在HTML DOM中找到了我的Silverlight对象(SLFromJS)的确切位置。这是JavaScript -

      3.   

        注意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 Web资源的链接来测试工作。
        2. 感谢我推荐的以下博文。

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

          accessing a form that is in an iframe