好的,首先,我是Silverlight的新手,并且正在寻找某人为下面的解决方案是否按照规定的方式进行操作提供指导。将参数从ASPX主机动态传递到Silverlight 4 xaml代码隐藏
昨天我开始研究一个乍一看似乎很简单直接的问题。我需要将托管Silverlight对象标记的ASPX代码隐藏的一些参数传递给托管Silverlight应用程序中的一个或多个Silverlight用户控件的代码隐藏。
所以,做一些研究之后,这是我公司开发的基本解决...
我发现一个属性可以被添加到该对象的标签叫initParams在,逗号分隔参数名称和值的列表可以添加到此属性。像这样...
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="ClientBin/SampleApplication.xap"/>
<param name="onError" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="3.0.40624.0" />
<param name="autoUpgrade" value="true" />
<param name="initParams" value='DealerId=17' />
</object>
这很好,除了DealerId参数基本上是硬编码在对象标记中,并不真正有用。
接下来我做的是用一个文字控件替换这个对象标签,并将页面代码中的文字控件的文本设置为一个StringBuilder的值(我在其中建立了完整的对象标签动态添加正确的DealerId值)。在下面的例子中,DealerId是硬编码的,但你明白了。
var sb = new StringBuilder();
sb.Append(@"<object data=""data:application/x-silverlight-2,"" type=""application/x-silverlight-2"" width=""90%"" height=""80%"">");
sb.Append(@"<param name=""source"" value=""ClientBin/Ascend.SilverlightViewer.xap""/>");
sb.Append(@"<param name=""onError"" value=""onSilverlightError"" />");
sb.Append(@"<param name=""background"" value=""white"" />");
sb.Append(@"<param name=""minRuntimeVersion"" value=""3.0.40624.0"" />");
sb.Append(@"<param name=""autoUpgrade"" value=""true"" />");
sb.Append(@"<param name=""initParams"" value='");
sb.Append(@"ServiceUrl=");
sb.AppendFormat("http://{0}{1}", Request.Url.Authority, ResolveUrl("~/ReportService.svc"));
sb.Append(@",DebugMode=Full");
sb.AppendFormat(@",DealerId={0}' />", 40);
sb.Append(@"</object>");
litObjectTag.Text = sb.ToString();
我的目标,如果最初的设计是理智的,是再拉这个对象标签创建到服务器控制,这将有DealerId财产,这反过来将主机内设置代码隐藏。
此时,我让主机动态地将参数值添加到对象标记的initParams属性中,下一步是获取这些值并在托管的Silverlight应用程序中利用它们。
我发现了一些文章来帮助解决这个问题;我创建了App.xaml.cs内的公共字典,并Application_Startup事件中设置它...
public IDictionary<string, string> InitConfigDictionary;
private void Application_Startup(object sender, StartupEventArgs e)
{
InitConfigDictionary = e.InitParams;
this.RootVisual = new MainPage();
}
现在,我可以访问此公共字典从任何的.xaml用户的代码隐藏控制,像这样...
App app =(App)Application.Current; var dealerId = app.InitConfigDictionary [“DealerId”];
这个设计工作得很好,我只是寻找一些指导,因为我是Silverlight的新手。这个实现再一次起作用,但似乎只是将一个动态值从主机传递给.xaml文件需要很多工作。
因为我是新来的Silverlight,我希望更有经验的人可以说是两种:
一)帕特里克,你疯了,你为什么要通过这些工作会时明确Silverlight你可以通过使用“xxxxxx”来完成。 b)是的,帕特里克,这是一个阻力,但这种设计基本上是你在Silverlight中必须做的。
再次,任何可以提供的指导将非常感谢,谢谢。 - PWK
Rakibul, 非常感谢回复,但我确实在寻找一些经验丰富的Silverlight开发人员的指导。我明白如何完成任务;我只是想知道方法是否符合'Silverlight-way' - Pattrick – 2010-08-13 14:17:59