最後に、リボンボタンクリックからSilverlightアプリケーションのC#コード内の関数を正常に呼び出しました。
これが最終出力のスクリーンショットです。
これがPoCが行っていることです
- カスタムエリア-サブエリアのCRMでホストされているSilverlightアプリケーションがあります。この順番には2つのWebリソースが必要です
- リボンにカスタムボタンが追加されています
- 3番目のWebリソースはJavaScript関数をホストしています
- JavaScript WebリソースのCRMリボン関数のカスタムボタンをクリックすると、SilverlightアプリケーションのC#コードのメソッドが呼び出されます。文字列入力がこのメソッドに渡されます
- C#メソッドは、入力文字列を大文字に変換して返します。
- 最後に、アラートは大文字の文字列で表示されます。
PoCを作成するための詳細は次のとおりです
- CRMで新しいソリューションを作成しました
サイトマップXMLを編集して、このPoCの新しいエリアとサブエリアを作成しました。これがcustomizations.xmlに追加されたXMLです。
アプリケーションリボンにカスタムボタンを追加しました。これがリボンの更新されたXMLです
Sequence = "101">
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();
}
}
ここに重要な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>
CRMでホストされているSilverlightアプリケーション。このために、2つのWebリソースを作成する必要があります。1つはHTMLをホストし、もう1つはXAP用です。
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ソリューションは次のようになります
- 終わり!次に、HTMLWebリソースのリンクを開いて作業をテストします。
私が参照した以下のブログ投稿に感謝します。
http://www.a2zmenu.com/Blogs/Silverlight/Calling-Silverlight-Method-from-JavaScript.aspx
iframe内にあるフォームへのアクセス