// Sets the currently selected symbol
        private void SymbolListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.AddedItems.Count != 1)
            {
                return;
            }

            _selectedSymbol = e.AddedItems[0] as SymbolViewModel;

            AddSymbolAsync(_selectedSymbol);
        }
		// Request geometry and new message to the layer
		private async void AddSymbolAsync(SymbolViewModel symbolViewModel)
		{
			try
			{
				Dictionary<string, string> values = (Dictionary<string, string>)symbolViewModel.Model.Values;
				string geometryControlType = values["GeometryType"];
				DrawShape requestedShape = DrawShape.Point;

				switch (geometryControlType)
				{
					case "Point":
						requestedShape = DrawShape.Point;
						break;
					case "Line":
						requestedShape = DrawShape.Polyline;
						break;
					case "Polygon":
						requestedShape = DrawShape.Polygon;
						break;
					case "Circle":
						requestedShape = DrawShape.Circle;
						break;
					case "Rectangular":
						requestedShape = DrawShape.Rectangle;
						break;
					default:
						await new MessageDialog("Selected symbol is not supported in this sample", "Symbol Dictionary Search Sample").ShowAsync();
						return;
				}
				while (true)
				{
					Esri.ArcGISRuntime.Geometry.Geometry geometry = null;

					try
					{
						geometry = await MyMapView.Editor.RequestShapeAsync(requestedShape, null, null);
					}
					catch { }

					if (geometry == null)
						return;

					// Create a new message
					Message msg = new Message();

					// Set the ID and other parts of the message
					msg.Id = Guid.NewGuid().ToString();
					msg.Add("_type", "position_report");
					msg.Add("_action", "update");
					msg.Add("_wkid", MyMapView.SpatialReference.Wkid.ToString());
					msg.Add("sic", _selectedSymbol.SymbolID);
					msg.Add("uniquedesignation", "1");

					// Construct the Control Points based on the geometry type of the drawn geometry.
					switch (requestedShape)
					{
						case DrawShape.Point:
							MapPoint point = geometry as MapPoint;
							msg.Add("_control_points", point.X.ToString(CultureInfo.InvariantCulture) + "," + point.Y.ToString(CultureInfo.InvariantCulture));
							break;
						case DrawShape.Polygon:
							Polygon polygon = geometry as Polygon;
							string cpts = string.Empty;
							foreach (var pt in polygon.Parts[0].GetPoints())
								cpts += ";" + pt.X.ToString(CultureInfo.InvariantCulture) + "," + pt.Y.ToString(CultureInfo.InvariantCulture);
							msg.Add("_control_points", cpts);
							break;
						case DrawShape.Polyline:
							Polyline polyline = geometry as Polyline;
							cpts = string.Empty;
							foreach (var pt in polyline.Parts[0].GetPoints())
								cpts += ";" + pt.X.ToString(CultureInfo.InvariantCulture) + "," + pt.Y.ToString(CultureInfo.InvariantCulture);
							msg.Add("_control_points", cpts);
							break;
					}

					// Process the message
					if (!_messageLayer.ProcessMessage(msg))
						await new MessageDialog("Failed to process message.", "Symbol Dictionary Search Sample").ShowAsync();

					btnClearMap.IsEnabled = true;
				}
			}
			catch (Exception ex)
			{
				var _x = new MessageDialog(ex.Message, "Symbol Dictionary Search Sample").ShowAsync();
			}
		}
        // Request geometry and new message to the layer
        private async void AddSymbolAsync(SymbolViewModel symbolViewModel)
        {
            try
            {
                Dictionary <string, string> values = (Dictionary <string, string>)symbolViewModel.Model.Values;
                string    geometryControlType      = values["GeometryType"];
                DrawShape requestedShape           = DrawShape.Point;

                switch (geometryControlType)
                {
                case "Point":
                    requestedShape = DrawShape.Point;
                    break;

                case "Line":
                    requestedShape = DrawShape.Polyline;
                    break;

                case "Polygon":
                    requestedShape = DrawShape.Polygon;
                    break;

                case "Circle":
                    requestedShape = DrawShape.Circle;
                    break;

                case "Rectangular":
                    requestedShape = DrawShape.Rectangle;
                    break;

                default:
                    await new MessageDialog("Selected symbol is not supported in this sample", "Symbol Dictionary Search Sample").ShowAsync();
                    return;
                }

                Esri.ArcGISRuntime.Geometry.Geometry geometry = null;

                try
                {
                    geometry = await MyMapView.Editor.RequestShapeAsync(requestedShape, null, null);
                }
                catch { }

                if (geometry == null)
                {
                    return;
                }

                // Create a new message
                Message msg = new Message();

                // Set the ID and other parts of the message
                msg.Id = Guid.NewGuid().ToString();
                msg.Add("_type", "position_report");
                msg.Add("_action", "update");
                msg.Add("_wkid", MyMapView.SpatialReference.Wkid.ToString());
                msg.Add("sic", _selectedSymbol.SymbolID);
                msg.Add("uniquedesignation", "1");

                // Construct the Control Points based on the geometry type of the drawn geometry.
                switch (requestedShape)
                {
                case DrawShape.Point:
                    MapPoint point = geometry as MapPoint;
                    msg.Add("_control_points", point.X.ToString(CultureInfo.InvariantCulture) + "," + point.Y.ToString(CultureInfo.InvariantCulture));
                    break;

                case DrawShape.Polygon:
                    Polygon polygon = geometry as Polygon;
                    string  cpts    = string.Empty;
                    foreach (var pt in polygon.Parts[0].GetPoints())
                    {
                        cpts += ";" + pt.X.ToString(CultureInfo.InvariantCulture) + "," + pt.Y.ToString(CultureInfo.InvariantCulture);
                    }
                    msg.Add("_control_points", cpts);
                    break;

                case DrawShape.Polyline:
                    Polyline polyline = geometry as Polyline;
                    cpts = string.Empty;
                    foreach (var pt in polyline.Parts[0].GetPoints())
                    {
                        cpts += ";" + pt.X.ToString(CultureInfo.InvariantCulture) + "," + pt.Y.ToString(CultureInfo.InvariantCulture);
                    }
                    msg.Add("_control_points", cpts);
                    break;
                }

                // Process the message
                if (!_messageLayer.ProcessMessage(msg))
                {
                    await new MessageDialog("Failed to process message.", "Symbol Dictionary Search Sample").ShowAsync();
                }
            }
            catch (Exception ex)
            {
                var _ = new MessageDialog(ex.Message, "Symbol Dictionary Search Sample").ShowAsync();
            }
        }