This question is locked. New answers and comments are not allowed.
Hello, I was hoping someone can help me with this issue I am having.
I have a map application that does the following functions:
I displays routes that contains varying numbers of stops. Each stop is represented by a flag and the route is the line that connects its related stops (all color coded per route). Right now I encounter the error :Unhandled Error in Silverlight Application Code: 4008 which crashes my application ONLY when displaying 42 routes and above. I initially thought that it might have something to do with the number of stops but I have tested using more than 5k stops and it works fine as long as there 41 routes or less.
my code is sort of divided into a number of user controls but I will try to present the relevant parts here:
the xaml view:
<UserControl x:Class="PcsysSLFx.Controls.Maps.SLFxMapView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
Loaded="UserControl_Loaded">
<UserControl.Resources>
<DataTemplate x:Key="MapItemTemplate">
<Border telerik:MapLayer.Location="{Binding Location}"
telerik:MapLayer.HotSpot="{Binding HotSpot}"
Background="{Binding Background}"
BorderBrush="{Binding BorderBrush}"
BorderThickness="{Binding BorderThickness}">
<Grid Width="50"
Height="70"
Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0"
Text="{Binding Title}"
HorizontalAlignment="Center" />
<TextBlock Grid.Row="1"
Text="{Binding Description}"
HorizontalAlignment="Center" />
</Grid>
</Border>
</DataTemplate>
</UserControl.Resources>
<Grid x:Name="LayoutRoot"
Background="White">
<telerik:RadBusyIndicator x:Name="busyIndicator"
IsIndeterminate="False">
<telerik:RadMap x:Name="slFxMapView"
InitializeCompleted="slFxMapView_InitializeCompleted"
MapMouseDoubleClick="slFxMapView_MapMouseDoubleClick"
UseDefaultLayout="True"
ScaleVisibility="Collapsed"
MiniMapExpanderVisibility="Collapsed"
MouseLocationIndicatorVisibility="Collapsed"
ZoomBarPresetsVisibility="Collapsed"
MouseClickMode="Center"
MouseDoubleClickMode="None"
ZoomLevel="{Binding Path=ZoomLevel}"
Center="{Binding Path=Center}"
ZoomChanged="slFxMapView_ZoomChanged"
NavigationVisibility="Collapsed">
<telerik:InformationLayer x:Name="calloutLayer" />
<telerik:InformationLayer x:Name="vehicleLayer" />
</telerik:RadMap>
</telerik:RadBusyIndicator>
</Grid>
</UserControl>
Code Behind:
private void SetMapItems()
{
if (this.MapItem.PcsysFxMapDataSets == null)
{
return;
}
this.busyIndicator.IsBusy = true;
if (this.MapItem == null)
{
this.busyIndicator.IsBusy = false;
return;
}
this.slFxMapView.Items.Clear();
this.layerList.Clear();
itemFound = false;
if (this.ParentOfType<SLFxMap>().MapSearch.TimerRequest != true)
{
this.calloutLayer.Items.Clear();
this.vehicleLayer.Items.Clear();
}
Location topLeftLocation = new Location(0, 100);
Location bottomRightLocation = new Location(100, 0);
int appColorcount = AppBase.Current.RootVisualContainer.Colors.Count();
foreach (var dataSet in this.MapItem.PcsysFxMapDataSets)
{
var itemsList = (from l in dataSet.PointLocations orderby l.ExtraData["GroupingField"] select l.ExtraData["GroupingField"]).Distinct();
if (itemsList.Count() > 0) this.ImageHeadings = new List<RotateTransform>();
int count = 0;
foreach (var listItem in itemsList)
{
var color = AppBase.Current.RootVisualContainer.Colors.FirstOrDefault(p => p.ColorId == count);
if (dataSet.ConnectedPoints)
{
InformationLayer lineLayer = new InformationLayer();
InformationLayer pointLayer = new InformationLayer();
InformationLayer pinpointLayer = new InformationLayer();
MapPolyline polyLine = new MapPolyline();
polyLine.Points = new LocationCollection();
foreach (MapViewItem item in dataSet.PointLocations.OrderBy(d => d.DateTime).Where(p => p.ExtraData["GroupingField"].ToString() == listItem.ToString()))
{
topLeftLocation = this.GetExtremeTopLeft(topLeftLocation, item.GPSLat, item.GPSLon);
bottomRightLocation = this.GetExtremeBottomRight(bottomRightLocation, item.GPSLat, item.GPSLon);
// test code to make ellipse into pinpoint
var pinPoint = new SLFxMapPinPoint();
pinPoint.ImageSource = ResolveImageUri(dataSet.ImageUri);
pinPoint.MaskSource = ResolveImageUri(dataSet.ImageMaskUri);
pinPoint.MaskColor = GetMapItemColor(color);
pinPoint.MapPinPointLocation = new Location(item.GPSLat, item.GPSLon);
ToolTipService.SetToolTip(pinPoint, BuildToolTipString(dataSet.PcsysFxMapDataSetDisplayInfoes.ToList(), item));
MapLayer.SetLocation(pinPoint, pinPoint.MapPinPointLocation);
pinpointLayer.Items.Add(pinPoint);
pinpointlayercount++;
Location location = new Location(item.GPSLat, item.GPSLon);
if ((calloutDisplayed) && (item.Label == tempcalloutId))
{
calloutLocation = pinPoint.MapPinPointLocation;
itemFound = true;
}
polyLine.Stroke = new SolidColorBrush(color.MediaColor);
polyLine.StrokeThickness = dataSet.LineThickness;
polyLine.Points.Add(location);
polylinepointscount++;
}
lineLayer.Items.Add(polyLine);
this.slFxMapView.Items.Add(lineLayer);
this.slFxMapView.Items.Add(pointLayer);
this.slFxMapView.Items.Add(pinpointLayer);
}
else
{
InformationLayer layer = new InformationLayer();
var pointLocationsByTransportId = dataSet.PointLocations.Where(l => l.ExtraData["GroupingField"].ToString() == listItem.ToString());
foreach (MapViewItem item in pointLocationsByTransportId)
{
topLeftLocation = this.GetExtremeTopLeft(topLeftLocation, item.GPSLat, item.GPSLon);
bottomRightLocation = this.GetExtremeBottomRight(bottomRightLocation, item.GPSLat, item.GPSLon);
var pinPoint = new SLFxMapPinPoint();
var stopCompleted = false;
var activityStatus = string.Empty;
try
{
stopCompleted = Convert.ToInt32(item.ExtraData["IsComplete"]) == 1 ? true : false;
}
catch
{
}
if (!stopCompleted)
{
pinPoint.ImageSource = ResolveImageUri(dataSet.ImageUri);
}
else
{
pinPoint.ImageSource = ResolveImageUri(dataSet.AlternateImageUri);
}
if (dataSet.ImageMaskUri != null && dataSet.ImageMaskUri != string.Empty)
{
AssignMaskColor(ref pinPoint, item, dataSet);
pinPoint.MaskSource = ResolveImageUri(dataSet.ImageMaskUri);
}
if (dataSet.ShowLabel)
{
//display labels of map items and truncates labes greater than 10 characters for readability
var label = item.Label;
if (item.Label.Length > 12) label = label.Substring(0, 12) + "...";
pinPoint.Text = label;
}
pinPoint.MapPinPointLocation = new Location(item.GPSLat, item.GPSLon);
MapLayer.SetLocation(pinPoint, pinPoint.MapPinPointLocation);
ToolTipService.SetToolTip(pinPoint, BuildToolTipString(dataSet.PcsysFxMapDataSetDisplayInfoes.ToList(), item));
if ((calloutDisplayed) && (item.Label == tempcalloutId))
{
calloutLocation = pinPoint.MapPinPointLocation;
itemFound = true;
}
double angle = -1.0;
try
{
angle = Convert.ToDouble(item.ExtraData["Heading"]);
}
catch
{
}
if (angle > -1)
{
RotateTransform maskheading = new RotateTransform();
maskheading.Angle = Convert.ToDouble(item.ExtraData["Heading"], CultureInfo.InvariantCulture);
pinPoint.mask.RenderTransformOrigin = new Point(0.5, 0.6);
pinPoint.mask.RenderTransform = maskheading;
}
layer.Items.Add(pinPoint);
SetImageScale(layer);
}
this.slFxMapView.Items.Add(layer);
var test = layer.Items.Count();
layerList.Add(layer);
}
}
}
topLeftLocation.Latitude += margin;
topLeftLocation.Longitude -= margin;
bottomRightLocation.Longitude += margin;
bottomRightLocation.Latitude -= margin;
if (this.ParentOfType<SLFxMap>().MapSearch.TimerRequest != true)
{
LocationRect rect = new LocationRect(topLeftLocation, bottomRightLocation);
try
{
rect.MapControl = this.slFxMapView;
}
catch (Exception ex)
{
if (ex != null)
{
this.busyIndicator.IsBusy = false;
return;
}
}
this.slFxMapView.Center = rect.Center;
this.slFxMapView.ZoomLevel = rect.ZoomLevel;
}
foreach (var item in layerList)
{
SetImageScale(item);
}
if ((calloutDisplayed) && (this.calloutLayer.Items.Count > 0))
{
var vehicleCallout = this.calloutLayer.Items.FirstOrDefault() as MapViewItem;
vehicleCallout.Location = calloutLocation;
calloutLayer.Items.Clear();
if (itemFound)
{
calloutLayer.Items.Add(vehicleCallout);
}
}
if (!this.slFxMapView.Items.Contains(this.calloutLayer))
{
this.slFxMapView.Items.Add(this.calloutLayer);
}
this.busyIndicator.IsBusy = false;
}
So far when I trace the problem, the code actually passes through here without a hitch, its when it start to render does the app crash. Hope you guys can help, thanks in advance.
Oliver
I have a map application that does the following functions:
I displays routes that contains varying numbers of stops. Each stop is represented by a flag and the route is the line that connects its related stops (all color coded per route). Right now I encounter the error :Unhandled Error in Silverlight Application Code: 4008 which crashes my application ONLY when displaying 42 routes and above. I initially thought that it might have something to do with the number of stops but I have tested using more than 5k stops and it works fine as long as there 41 routes or less.
my code is sort of divided into a number of user controls but I will try to present the relevant parts here:
the xaml view:
<UserControl x:Class="PcsysSLFx.Controls.Maps.SLFxMapView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
Loaded="UserControl_Loaded">
<UserControl.Resources>
<DataTemplate x:Key="MapItemTemplate">
<Border telerik:MapLayer.Location="{Binding Location}"
telerik:MapLayer.HotSpot="{Binding HotSpot}"
Background="{Binding Background}"
BorderBrush="{Binding BorderBrush}"
BorderThickness="{Binding BorderThickness}">
<Grid Width="50"
Height="70"
Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0"
Text="{Binding Title}"
HorizontalAlignment="Center" />
<TextBlock Grid.Row="1"
Text="{Binding Description}"
HorizontalAlignment="Center" />
</Grid>
</Border>
</DataTemplate>
</UserControl.Resources>
<Grid x:Name="LayoutRoot"
Background="White">
<telerik:RadBusyIndicator x:Name="busyIndicator"
IsIndeterminate="False">
<telerik:RadMap x:Name="slFxMapView"
InitializeCompleted="slFxMapView_InitializeCompleted"
MapMouseDoubleClick="slFxMapView_MapMouseDoubleClick"
UseDefaultLayout="True"
ScaleVisibility="Collapsed"
MiniMapExpanderVisibility="Collapsed"
MouseLocationIndicatorVisibility="Collapsed"
ZoomBarPresetsVisibility="Collapsed"
MouseClickMode="Center"
MouseDoubleClickMode="None"
ZoomLevel="{Binding Path=ZoomLevel}"
Center="{Binding Path=Center}"
ZoomChanged="slFxMapView_ZoomChanged"
NavigationVisibility="Collapsed">
<telerik:InformationLayer x:Name="calloutLayer" />
<telerik:InformationLayer x:Name="vehicleLayer" />
</telerik:RadMap>
</telerik:RadBusyIndicator>
</Grid>
</UserControl>
Code Behind:
private void SetMapItems()
{
if (this.MapItem.PcsysFxMapDataSets == null)
{
return;
}
this.busyIndicator.IsBusy = true;
if (this.MapItem == null)
{
this.busyIndicator.IsBusy = false;
return;
}
this.slFxMapView.Items.Clear();
this.layerList.Clear();
itemFound = false;
if (this.ParentOfType<SLFxMap>().MapSearch.TimerRequest != true)
{
this.calloutLayer.Items.Clear();
this.vehicleLayer.Items.Clear();
}
Location topLeftLocation = new Location(0, 100);
Location bottomRightLocation = new Location(100, 0);
int appColorcount = AppBase.Current.RootVisualContainer.Colors.Count();
foreach (var dataSet in this.MapItem.PcsysFxMapDataSets)
{
var itemsList = (from l in dataSet.PointLocations orderby l.ExtraData["GroupingField"] select l.ExtraData["GroupingField"]).Distinct();
if (itemsList.Count() > 0) this.ImageHeadings = new List<RotateTransform>();
int count = 0;
foreach (var listItem in itemsList)
{
var color = AppBase.Current.RootVisualContainer.Colors.FirstOrDefault(p => p.ColorId == count);
if (dataSet.ConnectedPoints)
{
InformationLayer lineLayer = new InformationLayer();
InformationLayer pointLayer = new InformationLayer();
InformationLayer pinpointLayer = new InformationLayer();
MapPolyline polyLine = new MapPolyline();
polyLine.Points = new LocationCollection();
foreach (MapViewItem item in dataSet.PointLocations.OrderBy(d => d.DateTime).Where(p => p.ExtraData["GroupingField"].ToString() == listItem.ToString()))
{
topLeftLocation = this.GetExtremeTopLeft(topLeftLocation, item.GPSLat, item.GPSLon);
bottomRightLocation = this.GetExtremeBottomRight(bottomRightLocation, item.GPSLat, item.GPSLon);
// test code to make ellipse into pinpoint
var pinPoint = new SLFxMapPinPoint();
pinPoint.ImageSource = ResolveImageUri(dataSet.ImageUri);
pinPoint.MaskSource = ResolveImageUri(dataSet.ImageMaskUri);
pinPoint.MaskColor = GetMapItemColor(color);
pinPoint.MapPinPointLocation = new Location(item.GPSLat, item.GPSLon);
ToolTipService.SetToolTip(pinPoint, BuildToolTipString(dataSet.PcsysFxMapDataSetDisplayInfoes.ToList(), item));
MapLayer.SetLocation(pinPoint, pinPoint.MapPinPointLocation);
pinpointLayer.Items.Add(pinPoint);
pinpointlayercount++;
Location location = new Location(item.GPSLat, item.GPSLon);
if ((calloutDisplayed) && (item.Label == tempcalloutId))
{
calloutLocation = pinPoint.MapPinPointLocation;
itemFound = true;
}
polyLine.Stroke = new SolidColorBrush(color.MediaColor);
polyLine.StrokeThickness = dataSet.LineThickness;
polyLine.Points.Add(location);
polylinepointscount++;
}
lineLayer.Items.Add(polyLine);
this.slFxMapView.Items.Add(lineLayer);
this.slFxMapView.Items.Add(pointLayer);
this.slFxMapView.Items.Add(pinpointLayer);
}
else
{
InformationLayer layer = new InformationLayer();
var pointLocationsByTransportId = dataSet.PointLocations.Where(l => l.ExtraData["GroupingField"].ToString() == listItem.ToString());
foreach (MapViewItem item in pointLocationsByTransportId)
{
topLeftLocation = this.GetExtremeTopLeft(topLeftLocation, item.GPSLat, item.GPSLon);
bottomRightLocation = this.GetExtremeBottomRight(bottomRightLocation, item.GPSLat, item.GPSLon);
var pinPoint = new SLFxMapPinPoint();
var stopCompleted = false;
var activityStatus = string.Empty;
try
{
stopCompleted = Convert.ToInt32(item.ExtraData["IsComplete"]) == 1 ? true : false;
}
catch
{
}
if (!stopCompleted)
{
pinPoint.ImageSource = ResolveImageUri(dataSet.ImageUri);
}
else
{
pinPoint.ImageSource = ResolveImageUri(dataSet.AlternateImageUri);
}
if (dataSet.ImageMaskUri != null && dataSet.ImageMaskUri != string.Empty)
{
AssignMaskColor(ref pinPoint, item, dataSet);
pinPoint.MaskSource = ResolveImageUri(dataSet.ImageMaskUri);
}
if (dataSet.ShowLabel)
{
//display labels of map items and truncates labes greater than 10 characters for readability
var label = item.Label;
if (item.Label.Length > 12) label = label.Substring(0, 12) + "...";
pinPoint.Text = label;
}
pinPoint.MapPinPointLocation = new Location(item.GPSLat, item.GPSLon);
MapLayer.SetLocation(pinPoint, pinPoint.MapPinPointLocation);
ToolTipService.SetToolTip(pinPoint, BuildToolTipString(dataSet.PcsysFxMapDataSetDisplayInfoes.ToList(), item));
if ((calloutDisplayed) && (item.Label == tempcalloutId))
{
calloutLocation = pinPoint.MapPinPointLocation;
itemFound = true;
}
double angle = -1.0;
try
{
angle = Convert.ToDouble(item.ExtraData["Heading"]);
}
catch
{
}
if (angle > -1)
{
RotateTransform maskheading = new RotateTransform();
maskheading.Angle = Convert.ToDouble(item.ExtraData["Heading"], CultureInfo.InvariantCulture);
pinPoint.mask.RenderTransformOrigin = new Point(0.5, 0.6);
pinPoint.mask.RenderTransform = maskheading;
}
layer.Items.Add(pinPoint);
SetImageScale(layer);
}
this.slFxMapView.Items.Add(layer);
var test = layer.Items.Count();
layerList.Add(layer);
}
}
}
topLeftLocation.Latitude += margin;
topLeftLocation.Longitude -= margin;
bottomRightLocation.Longitude += margin;
bottomRightLocation.Latitude -= margin;
if (this.ParentOfType<SLFxMap>().MapSearch.TimerRequest != true)
{
LocationRect rect = new LocationRect(topLeftLocation, bottomRightLocation);
try
{
rect.MapControl = this.slFxMapView;
}
catch (Exception ex)
{
if (ex != null)
{
this.busyIndicator.IsBusy = false;
return;
}
}
this.slFxMapView.Center = rect.Center;
this.slFxMapView.ZoomLevel = rect.ZoomLevel;
}
foreach (var item in layerList)
{
SetImageScale(item);
}
if ((calloutDisplayed) && (this.calloutLayer.Items.Count > 0))
{
var vehicleCallout = this.calloutLayer.Items.FirstOrDefault() as MapViewItem;
vehicleCallout.Location = calloutLocation;
calloutLayer.Items.Clear();
if (itemFound)
{
calloutLayer.Items.Add(vehicleCallout);
}
}
if (!this.slFxMapView.Items.Contains(this.calloutLayer))
{
this.slFxMapView.Items.Add(this.calloutLayer);
}
this.busyIndicator.IsBusy = false;
}
So far when I trace the problem, the code actually passes through here without a hitch, its when it start to render does the app crash. Hope you guys can help, thanks in advance.
Oliver