Maps for UWP
手順2:コードの追加
チュートリアル > クリックによるマップマーカーの追加 > 手順2:コードの追加

この手順では、MainPage.xaml.cs ファイルにコードを追加します。

  1. MainPage.xaml ページを右クリックし、リストから[コードの表示]を選択します。MainPage.xaml.cs が開きます。
  2. 次のコードをクラス宣言に追加します。
    C#
    コードのコピー
    C1VectorLayer vl;
    Random rnd = new Random();
    C1VectorPlacemark current = null;
    Point offset = new Point();
    
  3. MainPage()コンストラクタ内のInitializeComponent() メソッドに次のコードを追加します。このコードは、マップソースを変更し、C1VectorLayer を追加し、ランダムな座標を作成します。
    C#
    コードのコピー
    maps.Source = new VirtualEarthHybridSource();
                vl = new C1VectorLayer();
                maps.Layers.Add(vl);
                maps.RightTapped += maps_RightTapped;
                for (int i = 0; i < 10; i++)
                {
                    // ランダムな座標を作成します
                    Point pt = new Point(-80 + rnd.Next(160), -80 + rnd.Next(160));
                    AddMark(pt);
                }        }
    
  4. 次のコードは、MainPage()コンストラクタの閉じ中かっこの後に挿入する必要があります。このコードは、RightTapped イベントハンドラと AddMark() メソッドを追加します。

    C# コードの書き方

    C#
    コードのコピー
    void maps_RightTapped(object sender, RightTappedRoutedEventArgs e)
    {
    AddMark(maps.ScreenToGeographic(e.GetPosition(maps)));
    }
    void AddMark(Point pt)
    {
    Color clr = Utils.GetRandomColor(128, 192);
    C1VectorPlacemark mark = new C1VectorPlacemark()
    {
    GeoPoint = pt,
    Label = new TextBlock()
    {
    RenderTransform = new TranslateTransform() { Y = -5 },
    IsHitTestVisible = false,
    Text = (vl.Children.Count + 1).ToString()
    },
    LabelPosition = LabelPosition.Top,
    Geometry = Utils.CreateBaloon(),
    Stroke = new SolidColorBrush(Colors.DarkGray),
    Fill = new SolidColorBrush(clr),
    };
    mark.PointerPressed += mark_PointerPressed;
    maps.PointerMoved += mark_PointerMoved;
    mark.PointerReleased += mark_PointerReleased;
    vl.Children.Add(mark);
    mark.DoubleTapped += mark_DoubleTapped;
    } 
    
  5. 最後に追加するコードセクションでは、C1Maps コントロールのいくつかの Pointer イベントと、マーカーの DoubleTapped イベントを処理します。

    C# コードの書き方

    C#
    コードのコピー
    void mark_PointerMoved(object sender, PointerRoutedEventArgs e)
    {
    if (current == null)
    {
    return;
    }
    var cur = e.GetCurrentPoint(maps).Position;
    cur = new Point(cur.X - offset.X,
    cur.Y - offset.Y);
    current.GeoPoint = maps.ScreenToGeographic(cur);
    e.Handled = true;
    }
    void mark_PointerPressed(object sender, PointerRoutedEventArgs e)
    {
    offset = e.GetCurrentPoint(sender as C1VectorPlacemark).Position;
    current = sender as C1VectorPlacemark;
    e.Handled = true;
    }
    void mark_PointerReleased(object sender, PointerRoutedEventArgs e)
    {
    current = null;
    e.Handled = true;
    }
    void mark_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
    {
    e.Handled = true;
    vl.Children.Remove((C1VectorPlacemark)sender);
    }
    

この手順では、タップイベントなどのイベントを処理するコードを追加しました。また、マップソースを変更し、初期マップマーカーの座標をランダムに作成しました。