An alternative to Jennifer's solution is to add legend items by code on event 'Refreshed' (Jennifer's solution is better though). You have to instantiate a new LegendItemViewModel, initialize its label and its imagesource and add it to the LegendItems collection. The difficulty might be to create the imagesource from the symbol.The trick is to create a renderer with the symbols and let the renderer create the swatches. Code example :
private void Legend_Refreshed(object sender, ESRI.ArcGIS.Client.Toolkit.Legend.RefreshedEventArgs e)
{
GraphicsLayer layer = e.LayerItem.Layer as GraphicsLayer;
if (layer != null && layer.ID == "MyGraphics")
{
// Create a dummy renderer with the label and symbols to see in the legend
var renderer = new UniqueValueRenderer();
renderer.Infos.Add(new UniqueValueInfo { Label = "RedMarker", Symbol = LayoutRoot.Resources["RedMarkerSymbol"] as Symbol });
renderer.Infos.Add(new UniqueValueInfo { Label = "GlobePictureMarker", Symbol = LayoutRoot.Resources["GlobePictureMarkerSymbol"] as Symbol });
renderer.Infos.Add(new UniqueValueInfo { Label = "Red Line", Symbol = LayoutRoot.Resources["RedLineSymbol"] as Symbol });
renderer.Infos.Add(new UniqueValueInfo { Label = "Carto Line", Symbol = LayoutRoot.Resources["CartoLineSymbol"] as Symbol });
// ....... add others symbols
// Query asynchronously the legend infos for this renderer
renderer.QueryLegendInfos(layerLegendInfo => CreateLegendItems(e.LayerItem, layerLegendInfo), null);
}
}
private static void CreateLegendItems(LayerItemViewModel layerItem, LayerLegendInfo layerLegendInfo)
{
// Project the legend item infos coming from the renderer (LegendItemInfo) to legend items of the legend control (LegendItemViewModel)
var items = layerLegendInfo.LegendItemInfos.Select(legendItemInfo => new LegendItemViewModel { Label = legendItemInfo.Label, ImageSource = legendItemInfo.ImageSource });
layerItem.LegendItems = new ObservableCollection<LegendItemViewModel>(items);
}
See result in attached screenshot.