26 ноября 2010 г.

Относительно недавно познакомился с 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.

Комментариев нет:

Отправить комментарий