- Относительно недавно познакомился с Silverlight компонентом Bing Map Silverlight Control. Контрол этот полезный и интересный. Поэтому я сразу же попытался сотворить с его участием такое приложенице, что то вроде блокнотика на картах, чтобы можно было делать свои пометки и сохранять их в локальном хранилище. Описывать основы работы с контролом не буду, а сразу перейду к реализации. Основная проблема с которойя столкнулся - навигация по карте осуществляется курсором мышки. Как эту опцию отключить, не переопределяя в наследуемом классе обработчик OnMouseLeftButtonDown, я не нашел.
- Привожу код нового класса унаследованного от Microsoft.Maps.MapControl.Map.
Рис. Пример работы
Код класса:public class NonDragableMap : Microsoft.Maps.MapControl.Map
{
private Color _strokeColor;//Цвет линии
//По умолчанию режим редактирования будет отключен и можно будет как
//и прежде перемещаться по карте курсором мыши
public bool allowMapMove
{
get;
set;
}
public Color strokeColor
{
set{
this._strokeColor = value;
}
}
private double _strokeThickness;
public double strokeThickness//Толщина линии
{
get{
return this._strokeThickness;
}
set{
this._strokeThickness = value;
}
}
public NonDragableMap()
{
strokeColor = Colors.White;//По умолчанию цвет белый
strokeThickness = 5;
allowMapMove = true;
}
//Объект линии которую рисуем
private MapPolyline _mapLine;
//В коллекции координат храним координаты текущей линии:
private LocationCollection coordinateCollection;
//Обрабатываем событие нажатие левой клавиши мыши
//1) Этим методом убирается перемещение карты курсором мыши
//2) Создаем объекты отвечающие за прорисовку линии
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
if (this.allowMapMove)
{
base.OnMouseLeftButtonDown(e);//Разрешаем работу стандартного обработчика
return;
}
this._mapLine = new MapPolyline();
this._mapLine.Stroke = new System.Windows.Media.SolidColorBrush(this._strokeColor);//Цвет
this._mapLine.StrokeThickness = this._strokeThickness;
this._mapLine.StrokeLineJoin = PenLineJoin.Round;//Скругливаем пересечения - устраняет проблему артефактов при пересечении линий
this.coordinateCollection = new LocationCollection();
//Записываем собранные курсором координаты в координаты линии
this._mapLine.Locations = this.coordinateCollection;
//Добавляем линию на карту
this.Children.Add(this._mapLine);
}
protected override void OnMouseMove(MouseEventArgs e)
{
if (this.allowMapMove) base.OnMouseMove(e);
if (this.coordinateCollection != null)
{
var d = e.StylusDevice.GetStylusPoints(this);
foreach (StylusPoint s in d)
{
this.coordinateCollection.Add(this.ViewportPointToLocation(new Point(s.X, s.Y)));
}
this.coordinateCollection.Distinct();
}
}
//Обрабатываем события отпускания левой кнопки заершаем рисование
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
{
//Завершаем рисование
this.coordinateCollection = null;
this._mapLine = null;
e.Handled=true;
}
}
* This source code was highlighted with Source Code Highlighter.
Комментариев нет:
Отправить комментарий