Помогите усовершенствовать TOC-control Silverlight

0 голосов
спросил 22 Ноя, 10 от Mitrich (13,680 баллов) в категории Программные продукты Esri
Гуру программирования, посмотрите пожалуйста, кто может помочь с Сильверлайтом.
есть вот такой контрол для TOC + легенда

подробнее и скачать на сайте разработчика


он дает возможность не перешедшим на десятку+sp1, создавать список слоев с подслоями, даже если ваш сервер 9.3.1 не выставлен наружу
однако оказалось, контрол не поддерживает тайловые слои OSM VE  и им подобные.
как бы для всех неподдерживаемых типов слоев создать минимальный функционал: добавление в список, поддержка имени слоя, смена видимости при выборе чекбокса и прозрачности  слайдером.

источником данных для списка слоев в ТОС служит набор сервисов. Вот бы создать dummy-service, чтобы можно было слой добавить в TOC


я пробовал, но у меня не получилось Cry
технические подробности, если заинтересовались:
попробовал руками создать пустой сервис для неподдерживаемого типа слоя,
в ТОС.cs
процедура
private void legend_LoadCompleted(object sender, EventArgs e)
        {
            MapService service = (MapService)sender;
            addHandlers((TreeViewItem)tocTree.ItemContainerGenerator.ContainerFromItem(service));

передает в процедуру addHandlers - null. Что нужно передать в ContainerFromItem, дабы заработало?

       private void addHandlers(TreeViewItem tvitem)
        {
            if (tvitem == null) return;

соответсвенно нет tvitem , нет к нему привязанных событий.

думаю, не только я скажу большое спасибо
(кстати, легенда в 2.1rc тоже не поддерживает OSM. и

The legend supports the following layer types: ArcGISDynamicMapServiceLayer, ArcGISTiledMapServiceLayer, FeatureLayer. If the layer is an ArcGISDynamicMapServiceLayer or ArcGISTiledMapServiceLayer created using ArcGIS Server 10.0 SP1 or higher the legend is generated using the REST Map Service legend resource.

http://mapservice-url/legend

If the layers are version 10 or lower the legend is created using the ArcGIS.com legend service. In order to use the ArcGIS.com legend service your map service needs to be publicly accessible and your application must be able to access ArcGIS.com.)




29 Ответы

0 голосов
ответил 27 Дек, 10 от Mitrich (13,680 баллов)
да вряд ли, у меня тоже вываливается, но работает (т.е. компилится)  на форуме отвечали, что такая ошибка разработчикам известна, она периодически возникает, но как ее отловить, они не знают. на ходовые качества не влияет, в дизайнере комментировать надо. пока так.
0 голосов
ответил 27 Дек, 10 от TDenis (42,620 баллов)
Правильно понимаю, что вываливается даже с подключенным System.Windows.Controls.Data.Input?
0 голосов
ответил 27 Дек, 10 от Mitrich (13,680 баллов)
да, в реферерс подключено ( и на страничке тоже)

а мы об этой ошибке говорим-то?
System.InvalidOperationException
An unhandled exception was encountered while trying to render the current silverlight project on the design surface. To diagnose this failure, please try to run the project in a regular browser using the silverlight developer runtime.
   at Microsoft.Windows.Design.Platform.SilverlightViewProducer.OnUnhandledException(Object sender, ViewUnhandledExceptionEventArgs e)
   at Microsoft.Expression.Platform.Silverlight.SilverlightPlatformSpecificView.OnUnhandledException(Object sender, ViewUnhandledExceptionEventArgs args)
   at Microsoft.Expression.Platform.Silverlight.Host.SilverlightImageHost.<>c__DisplayClass1.<Application_UnhandledException>b__0(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

 
System.NullReferenceException
Object reference not set to an instance of an object.
   at vtforester.GIS.Silverlight.MapService..ctor(Map map, Layer layer, Int32 id, String legendurl, String labelText)
   at vtforester.GIS.Silverlight.TOC.loadTree()
   at vtforester.GIS.Silverlight.TOC.OnMapPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.RaisePropertyChangeNotifications(DependencyProperty dp, Object oldValue, Object newValue)
   at System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty property, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, ValueOperation operation)
   at System.Windows.DependencyObject.RefreshExpression(DependencyProperty dp)
   at System.Windows.Data.BindingExpression.SendDataToTarget()
   at System.Windows.Data.BindingExpression.SourceAcquired()
   at System.Windows.Data.BindingExpression.TargetLoaded(Object o, RoutedEventArgs e)
   at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
   at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)


0 голосов
ответил 27 Дек, 10 от TDenis (42,620 баллов)
Хм, нет, я про ошибку, описанную на первой странице, которая
System.Reflection.TargetInvocationException
И которая лечится комментированием <localtoolkit:Navigator ... />


А как эту System.NullReferenceException поймать?
0 голосов
ответил 28 Дек, 10 от Holger (19,360 баллов)
Да, так действительно  работает. Попробую сейчас всё вместе собрать.Спасибо.
Кстати, логотип изменить "ESRI powered" - только библиотеку перекомпилировать со своим, или как то ещё можно? Саму картинку отд не нашёл, чтобы изменить.
0 голосов
ответил 28 Дек, 10 от Mitrich (13,680 баллов)
в правом нижнем углу логотип? у map есть свойство отключить логотип, на память не помню logo-что-то... true/false
0 голосов
ответил 28 Дек, 10 от TDenis (42,620 баллов)
<esri:Map IsLogoVisible="False" ...>

Ну и поверх карты добавляете свой логотип, как обычный контрол. Если нужен, конечно.



Mitrich, я не знаю, как воспроизвести эту ошибку, у себя её не наблюдаю.

Судя по стеку, при изменении DependencyProperty TOC.MapProperty вызывается loadTree() и где-то там дальше при создании экземпляра MapService ошибка. Попробуйте в OnMapPropertyChanged изолировать вызов loadTree() с помощью

if (System.ComponentModel.DesignerProperties.IsInDesignTool == false)

{
}


Или аналогичным образом поискать, на какой именно строке конструктора падает.
0 голосов
ответил 12 Янв, 11 от Holger (19,360 баллов)
Mitrich, а легенду Ваш проект отображает, что -то у меня даже на ESRI данных ничего нет, один ТОС - список слоёв?
0 голосов
ответил 14 Янв, 11 от Holger (19,360 баллов)
:(
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...