添加形状
演示在Bing Map控件中点击(或者触控后)来添加线条。
Map控件中所有支持的形状均继承自MapShapeBase类型,目前有两个形状MapPolyline和MapPolygon。
为了能够在屏幕上添加点,需要将屏幕上的点坐标转换成Map控件中的GeoCoordinate,然后添加到MapShapeBase的Location属性中,注意这个Location属性需要自己初始化,它继承自ObservableCollection<GeoCoordinate>类型。
具体代码,首先在Page背后代码中添加字段:
MapPolyline polyline;
接着在Page加载事件中初始化MapPolyline并将其添加到Map控件中:
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
polyline = new MapPolyline();
//设置线条外表
polyline.Stroke = new SolidColorBrush(Colors.Blue);
polyline.StrokeThickness = 3;
polyline.Locations = new LocationCollection();
//将线条添加到Map控件中
map.Children.Add(polyline);
}
接着在Map事件中,将点加入到MapPolyline中就可以了:
private void Map_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
//获取屏幕点
var point = e.GetPosition((UIElement)sender);
//转换成GeoCoordinate
var geoPoint = map.ViewportPointToLocation(point);
//添加
polyline.Locations.Add(geoPoint);
}
添加层
我们还可以通过添加层来添加任何控件(UIElement),MapLayer代表着一个层,通过它可以根据地理位置来添加子控件。将MapLayer添加到Map的方式和MapShapeBase相似,都是通过Map.Children属性。MapLayer内具体控件的位置可以通过MapLayer的附加属性:Position、PositionOrigin和PositionOffset,以及PositionRectangle。
当然MapLayer的构造函数的不同重载会设置相应的属性,比如用GeoCoordinate(通过Map.BoundingRectangle.Center):
var uiElement = new Button()
{
Content = "Mgen",
Background = new SolidColorBrush(Colors.Gray)
};
var layer = new MapLayer();
layer.AddChild(uiElement, map.BoundingRectangle.Center);
map.Children.Add(layer);
结果会是:
如果用LocationRect对象(直接通过Map.BoundingRectangle属性):
layer.AddChild(uiElement, map.BoundingRectangle);
按钮会铺满整个Map控件:
比如设置一下偏移量:
layer.AddChild(uiElement, map.BoundingRectangle);
MapLayer.SetPositionOffset(layer, new Point(50, 50));
结果会是:
作者:Mgen