Хорошо, во-первых, я новичок в Silverlight и ищу кого-то, кто предоставит руководство относительно того, является ли следующее решение предписанным способом.
Вчера я начал работать над проблемой, которая на первый взгляд казалась довольно простой и понятной. Мне нужно передать несколько параметров из кодового компонента ASPX, в котором размещен тег объекта Silverlight, в код одного или нескольких пользовательских элементов управления 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 = (Приложение) Application.Current;
var dealerId = app.InitConfigDictionary ["DealerId"];
Этот дизайн прекрасно работает, я просто ищу руководство, так как я новичок в Silverlight. Еще раз, реализация работает, но кажется, что нужно проделать большую работу, чтобы передать динамическое значение из хоста в файлы .xaml.
Поскольку я новичок в Silverlight, я надеюсь, что кто-то с большим опытом может сказать, что либо:
а) Патрик, ты безумен, почему ты проходишь всю эту работу, когда явно в Silverlight ты достигнешь этого с помощью «xxxxxx».
б) Да, Патрик, это перетаскивание, но этот дизайн в основном то, что вы должны делать в Silverlight.
Еще раз, любое руководство, которое может быть предоставлено, будет высоко оценено, спасибо.
- PWK