3 Answers, 1 is accepted
0
Accepted
Hi John,
Thank you for writing.
You can follow a similar approach and handle the DragDrop event of the map instead of the list view. Please check my code snippet below:
I am also sending you a short video showing the result on my end.
I hope this helps. Should you have further questions please do not hesitate to write back.
Regards,
Hristo
Progress Telerik
Thank you for writing.
You can follow a similar approach and handle the DragDrop event of the map instead of the list view. Please check my code snippet below:
public partial class DragAndDropForm : RadForm{ public DragAndDropForm() { InitializeComponent(); this.SetupProviders(); this.SetupLayer(); this.SetupLegend(); this.SetupData(); this.radMap1.AllowDrop = true; this.radMap1.MouseMove += RadMap1_MouseMove; this.radMap1.MouseUp += RadMap1_MouseUp; this.radMap1.DragEnter += RadMap1_DragEnter; this.radMap1.DragDrop += RadMap1_DragDrop; } private void RadMap1_DragDrop(object sender, DragEventArgs e) { MapPin pin = e.Data.GetData(typeof(MapPin)) as MapPin; if (pin != null) { Point p = this.radMap1.MapElement.PointFromScreen(new Point(e.X, e.Y)); PointL pl = new PointL(p.X + this.radMap1.MapElement.ViewportInPixels.Location.X, p.Y + this.radMap1.MapElement.ViewportInPixels.Location.Y); PointG location = MapTileSystemHelper.PixelXYToLatLong(pl.X, pl.Y, this.radMap1.MapElement.ZoomLevel); pin.Location = new PointG(location.Latitude, location.Longitude); } } private void RadMap1_MouseMove(object sender, MouseEventArgs e) { if (!(e.Button == MouseButtons.Left)) { return; } PointL point = new PointL(e.X - this.radMap1.MapElement.PanOffset.Width, e.Y - this.radMap1.MapElement.PanOffset.Height); MapPin pin = this.radMap1.Layers.HitTest(point) as MapPin; if (pin != null && this.radMap1.MapElement.EnablePanning) { this.radMap1.MapElement.EnablePanning = false; } if (pin == null && !this.radMap1.MapElement.EnablePanning) { this.radMap1.MapElement.EnablePanning = true; } if (pin != null) { ((RadMap)sender).DoDragDrop(pin, DragDropEffects.Move); } } private void RadMap1_DragEnter(object sender, DragEventArgs e) { MapPin pin = e.Data.GetData(typeof(MapPin)) as MapPin; e.Effect = pin == null ? DragDropEffects.None : DragDropEffects.Move; } private void RadMap1_MouseUp(object sender, MouseEventArgs e) { this.radMap1.MapElement.EnablePanning = true; } private void SetupProviders() { OpenStreetMapProvider osmProvider = new OpenStreetMapProvider(); osmProvider.InitializationComplete += OsmProvider_InitializationComplete; this.radMap1.MapElement.Providers.Add(osmProvider); } private void OsmProvider_InitializationComplete(object sender, System.EventArgs e) { this.radMap1.Pan(new SizeL(-240, -440)); } private void SetupLayer() { MapLayer pinsLayer = new MapLayer("Pins"); MapLayer calloutLayer = new MapLayer("Callout"); this.radMap1.Layers.Add(pinsLayer); this.radMap1.Layers.Add(calloutLayer); } private void SetupLegend() { this.radMap1.MapElement.LegendElement.TitleElement.Text = "Pins"; this.radMap1.MapElement.LegendElement.SubtitleElement.Text = "Pin Layer"; this.radMap1.MapElement.LegendElement.Orientation = Orientation.Horizontal; this.radMap1.MapElement.LegendElement.ItemStackElement.Children.Add(new MapLegendItemElement("Pins", Color.FromArgb(37, 160, 218))); } private void SetupData() { this.radMap1.BeginUpdate(); using (StringReader reader = new StringReader(Properties.Resources.PhotoSpots)) { string line; while ((line = reader.ReadLine()) != null) { string[] coordinates = line.Split(','); double latitude = double.Parse(coordinates[0], CultureInfo.InvariantCulture); double longitude = double.Parse(coordinates[1], CultureInfo.InvariantCulture); MapPin pin = new MapPin(new PointG(latitude, longitude)); pin.Text = "Lat: " + coordinates[0] + " Long: " + coordinates[1]; pin.BackColor = Color.FromArgb(37, 160, 218); this.radMap1.Layers["Pins"].Add(pin); } } this.radMap1.EndUpdate(); }}I am also sending you a short video showing the result on my end.
I hope this helps. Should you have further questions please do not hesitate to write back.
Regards,
Hristo
Progress Telerik
Try our brand new, jQuery-free Angular 2 components built from ground-up which deliver the business app essential building blocks - a grid component, data visualization (charts) and form elements.
0
Chris
Top achievements
Rank 1
answered on 22 Mar 2018, 01:43 PM
Hristo,
Is it possible for the pin to stay drawn while dragging? Currently the pin disappears during the drag, but we'd like it to remain throughout the process if possible. Can this be done? Thanks.
Is it possible for the pin to stay drawn while dragging? Currently the pin disappears during the drag, but we'd like it to remain throughout the process if possible. Can this be done? Thanks.
0
Hello Chris,
Thank you for writing.
The required behavior can be achieved, however, it will require a different approach. The suggested solution in my previous post utilizes the native drag and drop support in Winforms. With the native OLE drag and drop the drag hint behavior can be achieved with some low-level native APIs. Additional information is available here: https://blogs.msdn.microsoft.com/adamroot/2008/02/19/shell-style-drag-and-drop-in-net-wpf-and-winforms/.
The alternative solution will not involve drag and drop at all. Instead, the actual movement of the pins will happen in the MouseMove and MouseUp events. Please check my code snippet below:
I am also attaching a short video showing the result on my end.
I hope this helps. Let me know if have other questions.
Regards,
Hristo
Progress Telerik
Thank you for writing.
The required behavior can be achieved, however, it will require a different approach. The suggested solution in my previous post utilizes the native drag and drop support in Winforms. With the native OLE drag and drop the drag hint behavior can be achieved with some low-level native APIs. Additional information is available here: https://blogs.msdn.microsoft.com/adamroot/2008/02/19/shell-style-drag-and-drop-in-net-wpf-and-winforms/.
The alternative solution will not involve drag and drop at all. Instead, the actual movement of the pins will happen in the MouseMove and MouseUp events. Please check my code snippet below:
public partial class CustomDragAndDropForm : RadForm{ public CustomDragAndDropForm() { InitializeComponent(); this.SetupProviders(); this.SetupLayer(); this.SetupLegend(); this.SetupData(); this.radMap1.MouseMove += RadMap1_MouseMove; this.radMap1.MouseUp += RadMap1_MouseUp; } MapPin currentPin; long xOffset = 0; long YOffset = 0; private void RadMap1_MouseMove(object sender, MouseEventArgs e) { if (!(e.Button == MouseButtons.Left)) { return; } PointL point = new PointL(e.X - this.radMap1.MapElement.PanOffset.Width, e.Y - this.radMap1.MapElement.PanOffset.Height); if (this.currentPin != null) { point.X += this.xOffset; point.Y += this.YOffset; PointG location = MapTileSystemHelper.PixelXYToLatLong(point.X, point.Y, this.radMap1.MapElement.ZoomLevel); this.currentPin.Location = new PointG(location.Latitude, location.Longitude); } MapPin pin = this.radMap1.Layers.HitTest(point) as MapPin; if (pin != null && this.currentPin == null && this.radMap1.MapElement.EnablePanning) { this.radMap1.MapElement.EnablePanning = false; pin.BackColor = Color.FromArgb(125, pin.BackColor.R, pin.BackColor.G, pin.BackColor.B); var pixelLocation = MapTileSystemHelper.LatLongToPixelXY(pin.Location, this.radMap1.MapElement.ZoomLevel); var drawRect = new RectangleL(pixelLocation.X - pin.Size.Width / 2, pixelLocation.Y - pin.Size.Height, pin.Size.Width, pin.Size.Height); this.xOffset = drawRect.X + drawRect.Width / 2 - point.X; this.YOffset = drawRect.Y + drawRect.Height - point.Y; this.currentPin = pin; } } private void RadMap1_MouseUp(object sender, MouseEventArgs e) { this.radMap1.MapElement.EnablePanning = true; if (this.currentPin != null) { this.currentPin.BackColor = Color.FromArgb(255, this.currentPin.BackColor.R, this.currentPin.BackColor.G, this.currentPin.BackColor.B); this.currentPin = null; } } private void SetupProviders() { OpenStreetMapProvider osmProvider = new OpenStreetMapProvider(); osmProvider.InitializationComplete += OsmProvider_InitializationComplete; this.radMap1.MapElement.Providers.Add(osmProvider); } private void OsmProvider_InitializationComplete(object sender, System.EventArgs e) { this.radMap1.Pan(new SizeL(-240, -440)); } private void SetupLayer() { MapLayer pinsLayer = new MapLayer("Pins"); MapLayer calloutLayer = new MapLayer("Callout"); this.radMap1.Layers.Add(pinsLayer); this.radMap1.Layers.Add(calloutLayer); } private void SetupLegend() { this.radMap1.MapElement.LegendElement.TitleElement.Text = "Pins"; this.radMap1.MapElement.LegendElement.SubtitleElement.Text = "Pin Layer"; this.radMap1.MapElement.LegendElement.Orientation = Orientation.Horizontal; this.radMap1.MapElement.LegendElement.ItemStackElement.Children.Add(new MapLegendItemElement("Pins", Color.FromArgb(37, 160, 218))); } private void SetupData() { this.radMap1.BeginUpdate(); using (StringReader reader = new StringReader(Properties.Resources.PhotoSpots)) { string line; while ((line = reader.ReadLine()) != null) { string[] coordinates = line.Split(','); double latitude = double.Parse(coordinates[0], CultureInfo.InvariantCulture); double longitude = double.Parse(coordinates[1], CultureInfo.InvariantCulture); MapPin pin = new MapPin(new PointG(latitude, longitude)); pin.Text = "Lat: " + coordinates[0] + " Long: " + coordinates[1]; pin.BackColor = Color.FromArgb(37, 160, 218); this.radMap1.Layers["Pins"].Add(pin); } } this.radMap1.EndUpdate(); }}I am also attaching a short video showing the result on my end.
I hope this helps. Let me know if have other questions.
Regards,
Hristo
Progress Telerik
Try our brand new, jQuery-free Angular components built from ground-up which deliver the business app essential building blocks - a grid component, data visualization (charts) and form elements.
