【发布时间】:2010-08-05 14:50:14
【问题描述】:
好的,首先,我是 Silverlight 的新手,我正在寻找可以就以下解决方案是否是解决此问题的规定方式提供指导的人。
昨天我开始研究一个问题,乍一看,它似乎非常简单明了。我需要将一些参数从托管 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 的新手,所以我希望有更多经验的人可以这样说:
a) 帕特里克,你疯了,你为什么要完成所有这些工作,而在 Silverlight 中你显然可以通过使用“xxxxxx”来完成这些工作。
b) 是的,Patrick,这很麻烦,但这种设计基本上是您在 Silverlight 中必须做的。
再次感谢您提供任何可以提供的指导,谢谢。 - 密码
【问题讨论】:
标签: parameters silverlight-4.0 asp.net