好的,首先,我是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