0

いくつかのカスタム機能には、Dynamics2011でSilverlightMVVMアプリケーションを使用することを計画しています。また、DynamicsモジュールとSilverlightモジュールの両方のアプリケーション全体を一貫して表示する必要があります。そのため、CRM内でこのSilverlightアプリケーションをホストするためのWebリソースを作成しています。

ここで問題となるのは、リボンに「保存」、「編集」などのボタンを作成する必要があることです。これらのボタンは、Silverlightモジュール内のボタンのように動作します。以下は重要な質問です

  1. 「Webリソース」を使用してホストされているSilverlightアプリケーションのビューモデル内のメソッドにアクセスするために、リボンにこのようなボタンを作成できますか?これらのメソッドは、Silverlightビューでユーザーが行ったデータ変更にもアクセスする必要があります。

  2. そのような状況を処理する他のより良い方法はありますか

ありがとう、

ナイルシュ

4

1 に答える 1

0

最後に、リボンボタンクリックからSilverlightアプリケーションのC#コード内の関数を正常に呼び出しました。

これが最終出力のスクリーンショットです。

出力

これがPoCが行っていることです

  1. カスタムエリア-サブエリアのCRMでホストされているSilverlightアプリケーションがあります。この順番には2つのWebリソースが必要です
  2. リボンにカスタムボタンが追加されています
  3. 3番目のWebリソースはJavaScript関数をホストしています
  4. JavaScript WebリソースのCRMリボン関数のカスタムボタンをクリックすると、SilverlightアプリケーションのC#コードのメソッドが呼び出されます。文字列入力がこのメソッドに渡されます
  5. C#メソッドは、入力文字列を大文字に変換して返します。
  6. 最後に、アラートは大文字の文字列で表示されます。

PoCを作成するための詳細は次のとおりです

  1. CRMで新しいソリューションを作成しました
  2. サイトマップXMLを編集して、このPoCの新しいエリアとサブエリアを作成しました。これがcustomizations.xmlに追加されたXMLです。

  3. アプリケーションリボンにカスタムボタンを追加しました。これがリボンの更新されたXMLです

    Sequence = "101">

  4. Silverlightアプリケーションを作成しました。ここに重要なC#コードがあります。

注System.Windows.Browser.HtmlPage.RegisterScriptableObject( "SilverlightCode"、this); および[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アプリケーション。このために、2つのWebリソースを作成する必要があります。1つはHTMLをホストし、もう1つはXAP用です。

  2. JavaScript関数をホストするためのもう1つのWebリソースを作成しました。IE 8の開発ツール(F12)は、HTML DOMでSilverlightオブジェクト(SLFromJS)の正確な場所を見つけるのに役立ちました。これが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. 終わり!次に、HTMLWebリソースのリンクを開いて作業をテストします。

私が参照した以下のブログ投稿に感謝します。

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

iframe内にあるフォームへのアクセス

于 2011-08-25T06:45:23.020 に答える