我们计划在Dynamics 2011中使用Silverlight MVVM应用程序以获得少量自定义功能。我们还希望为Dynamics和Silverlight模块提供一致的整体应用程序外观。这就是我们创建Web资源以在CRM中托管此Silverlight应用程序的原因。
现在问题是我们需要在功能区中创建“保存”,“编辑”等按钮,这反过来就像Silverlight模块中的按钮一样。以下是重要问题
我们可以在Ribbon中创建这样的按钮来访问使用“Web资源”托管的Silverlight应用程序的View Model中的方法。这些方法还必须访问用户在Silverlight Views中完成的数据更改。
还有其他更好的方法来处理这种情况
谢谢,
Nilesh制作
答案 0 :(得分:0)
最后,我从Ribbon按钮单击成功调用了Silverlight应用程序的C#代码中的函数。
以下是最终输出的屏幕截图。
这是PoC正在做的事情
以下是创建PoC的详细信息
通过编辑站点地图XML为此PoC创建新的区域和子区域。以下是customizations.xml中添加的XML。
在应用程序功能区中添加了自定义按钮。这是更新的Ribbon for Ribbon
序列= “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();
}
}
这是重要的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应用程序。为此,我们需要创建两个Web资源 - 一个用于托管HTML,另一个用于XAP。
再创建一个Web资源来托管JavaScript函数。 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解决方案现在跟着
感谢我推荐的以下博文。
http://www.a2zmenu.com/Blogs/Silverlight/Calling-Silverlight-Method-from-JavaScript.aspx