C# 如何在windows 10中创建可拖动的pin以提供拾取位置功能?
我正在Windows 10中使用MapControl,我希望允许用户拖动pin,当用户删除pin时,我希望使用API获取该位置的纬度和经度,并获取位置地址C# 如何在windows 10中创建可拖动的pin以提供拾取位置功能?,c#,windows-10-universal,C#,Windows 10 Universal,我正在Windows 10中使用MapControl,我希望允许用户拖动pin,当用户删除pin时,我希望使用API获取该位置的纬度和经度,并获取位置地址 MapControl map = frameworkElement as MapControl; map.MapServiceToken= "my service token"; BasicGeoposition councilPosition = new BasicGeoposition() { Latitude = Conver
MapControl map = frameworkElement as MapControl;
map.MapServiceToken= "my service token";
BasicGeoposition councilPosition = new BasicGeoposition()
{
Latitude = Convert.ToDouble(Info.GetType().GetRuntimeProperty("LATITUDE").GetValue(councilInfo, null)),
Longitude = Convert.ToDouble(Info.GetType().GetRuntimeProperty("LONGITUDE").GetValue(councilInfo, null))
};
Geopoint pinPoint = new Geopoint(councilPosition);
MapIcon locationPin = new MapIcon();
locationPin.Image= RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Images/pushpin.png"));
locationPin.Title = councilInfo.COUNCIL_NAME;
locationPin.CollisionBehaviorDesired = MapElementCollisionBehavior.RemainVisible;
locationPin.Location = councilPoint;
locationPin.NormalizedAnchorPoint = new Point(0.5, 1.0);
locationPin.ZIndex = 0;
map.MapElements.Add(locationPin);
await map.TrySetViewAsync(locationPin.Location, 15D, 0, 0, MapAnimationKind.Bow);
有人能建议需要使用哪些事件来实现拾取位置功能吗?请参阅此。它们使用XAML指定了显示点。您可以使用带有背景图钉图像的栅格,而不是边框,而是侦听该栅格的操纵事件
下面是实现我上面所说的功能的代码
private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
BasicGeoposition snPosition = new BasicGeoposition() { Latitude = 47.7356039173901, Longitude = -122.310697222129
};
Geopoint snPoint = new Geopoint(snPosition);
// Create a XAML border.
Grid grid = new Grid
{
Width=100,
Height=100,
Background = new ImageBrush() {ImageSource= new BitmapImage(new Uri("ms-appx:///Assets/icon.png", UriKind.RelativeOrAbsolute)), Stretch = Stretch.UniformToFill}
};
grid.ManipulationMode = ManipulationModes.TranslateX|ManipulationModes.TranslateY;
grid.ManipulationCompleted += Grid_ManipulationCompleted;
grid.ManipulationDelta +=Grid_ManipulationDelta;
// Center the map over the POI.
MapControl1.Center = snPoint;
MapControl1.ZoomLevel = 14;
CompositeTransform tran = new CompositeTransform();
grid.RenderTransform = tran;
// Add XAML to the map.
MapControl1.Children.Add(grid);
MapControl.SetLocation(grid, snPoint);
MapControl.SetNormalizedAnchorPoint(grid, new Point(0.5, 0.5));
}
private void Grid_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
Grid grid = sender as Grid;
CompositeTransform xform = grid.RenderTransform as CompositeTransform;
xform.TranslateX += e.Delta.Translation.X;
xform.TranslateY += e.Delta.Translation.Y;
// Rect point = grid.TransformToVisual(MapControl1).TransformBounds(new Rect(0,0, grid.Width, grid.Height));
e.Handled = true;
// Geopoint gPoint;
// MapControl1.GetLocationFromOffset(new Point(point.X, point.Y), out gPoint);
// Debug.WriteLine(gPoint.Position.Latitude);
// Debug.WriteLine(gPoint.Position.Longitude);
}
private void Grid_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
{
Grid grid = sender as Grid;
Rect point = grid.TransformToVisual(MapControl1).TransformBounds(new Rect(0, 0, grid.Width, grid.Height);
Geopoint gPoint;
MapControl1.GetLocationFromOffset(new Point(point.X, point.Y), out gPoint);
Debug.WriteLine(gPoint.Position.Latitude);
Debug.WriteLine(gPoint.Position.Longitude);
}
拖动后获取的位置不太准确。你可以对如何将accuarate point wrt提取到地图控制进行一些研究和开发,我无法得到公认的答案。经过大量的研究和帮助,我终于让它工作了。以下是一个工作示例:
public sealed partial class MainPage : Page
{
public MainPage()
{
InitializeComponent();
var position = new Geopoint(new BasicGeoposition
{
Latitude = 30.3618,
Longitude = -91.1067
});
var grid = new Grid
{
Width = 32,
Height = 50
};
var pushpin = new Image()
{
Source = new BitmapImage(new Uri("ms-appx:///Assets/Pushpin.png")),
Stretch = Stretch.Uniform,
ManipulationMode = ManipulationModes.TranslateX | ManipulationModes.TranslateY,
RenderTransform = new TranslateTransform()
};
pushpin.ManipulationStarted += Pushpin_ManipulationStarted;
pushpin.ManipulationDelta += Pushpin_ManipulationDelta;
pushpin.ManipulationCompleted += Pushpin_ManipulationCompleted;
grid.Children.Add(pushpin);
Map.Center = position;
Map.Children.Add(grid);
MapControl.SetLocation(grid, position);
MapControl.SetNormalizedAnchorPoint(grid, new Point(0.5, 1));
}
private Geopoint GetPosition(Image pushpin)
{
var grid = pushpin.Parent as Grid;
var anchor = MapControl.GetNormalizedAnchorPoint(grid);
var offset = pushpin.TransformToVisual(Map).TransformPoint(new Point(grid.Width * anchor.X, grid.Height * anchor.Y));
Map.GetLocationFromOffset(offset, out Geopoint position);
return position;
}
private void Pushpin_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
{
Map.PanInteractionMode = MapPanInteractionMode.Auto;
var pushpin = sender as Image;
var grid = pushpin.Parent as Grid;
var position = GetPosition(pushpin);
MapControl.SetLocation(grid, position);
var transform = pushpin.RenderTransform as TranslateTransform;
transform.X = 0;
transform.Y = 0;
}
private void Pushpin_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
var pushpin = sender as Image;
var transform = pushpin.RenderTransform as TranslateTransform;
transform.X += e.Delta.Translation.X;
transform.Y += e.Delta.Translation.Y;
}
private void Pushpin_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e)
{
Map.PanInteractionMode = MapPanInteractionMode.Disabled;
}
}
让我给你一个想法。请参阅此链接。它们使用XAML指定了显示点。您可以使用带有背景图钉图像的网格,而不是边框,而是侦听该网格的操纵事件。。这有助于满足您的要求吗?MapIcon不可能吗?我想允许用户拖动MapIcon并将其放到其他位置,当用户拖放时,可以使用纬度和纬度获取位置。我想不会。因为mapicon没有要注册的拖动事件或操作事件。但我还没有做过这方面的工作,好吧,实际上我过去也没有做过操纵事件,所以不知道如何使用它们进行拖放。你能在样本中添加答案吗?如果它符合我的要求,我会将答案标记为“是”,并奖励赏金。谢谢,我会尝试一下。好的。如果有任何问题,请告诉我该事件被多次调用。它显示许多位置。是吗?是的。您想要的是在完成拖动后获取位置,对吗?我会更新答案是的,图标就是图像,它会指向网格内的完美坐标吗?如果我添加图像作为网格的子元素,那么它会工作吗?