2

ユーザーがBingMapコントロールでポリゴンを描画およびリファインする機能を実装しようとしています。

シェイプレイヤーを追加し、タップイベントをオーバーライドして、単純なポリゴンを描画しました。これはすべて完全に機能します。ユーザーが描画されたポリゴンの任意のLocationオブジェクトをドラッグアンドドロップしてその形状を変更できるように、コントロールをさらに改良したいのですが、うまくいきません。

ポリゴンのLocationsプロパティにバインドされたMapItemControlを追加しようとしましたが、成功しませんでした。ポリゴンが正しくレンダリングされても、ピンがマップに表示されません。おそらく、Locationsコレクションはコレクションへの変更をUIに通知していないため、これらのピン用に別のコレクションを維持する必要がある場合があります。

ただし、これを実行した後でも、ポリゴンを変更するには、ピンをドラッグアンドドロップできる必要があります。誰かがこれをWindows8に実装して、考えを共有できる人はいますか?

編集

これで、地図上にLocationsコレクションを表示するピンができました。理想的には、これらをポリゴンのLocationsコレクションに結び付けたいのですが、物乞いは選択者にはなれません。ピンをドラッグできるようにする必要があります。

4

1 に答える 1

2

ポリゴン内の各ポイントを編集するために、ドラッグハンドルモジュールをポリゴンに追加しました。これは私が使用したウォークスルーです。

ドラッグハンドルモジュール

これはバージョン7.0用です。使用しているバージョンはわかりませんが、簡単に適応できます。

編集私はjavascript/htmlでこれを行いました。これをWindows8としてタグ付けしていることに気づきました。不思議なことに、Windows 8電話用のシルバーライトコントロールを作成していますか?

WPF C#ソリューション

これが私が思いついたもので、実装は非常に簡単です。あなたがする必要があるのは、私のイベントをMapPolygonオブジェクトにフックすることだけです。コードの背後にある考え方は、ポリゴンをクリックすると、ポリゴンの各頂点に画鋲(ドラッグできるようにイベントを作成する)を配置することです。各画鋲をドラッグアンドドロップしながら、必要に応じてポリゴンの位置を調整します。

polygon.MouseDown += new MouseButtonEventHandler(polygon_MouseDownResize);

そして、サイズ変更イベントを終了する方法として、キーを押したまま「esc」を使用して編集を停止することを選択しましたが、これは右クリックまたはその他の任意のイベントで実行できます。リストをクリアしpushPinVertices、イベント変数をリセットするだけです。

// === Editable polygon Events ===

private bool _shapeEdit;
public MapPolygon selectedPoly { get; set; }
public List<Pushpin> pushPinVertices { get; set; }


void polygon_MouseDownResize(object sender, MouseButtonEventArgs e)
{

    if (!_shapeEdit && selectedPoly == null)
    {
        _shapeEdit = true;
        selectedPoly = sender as MapPolygon;
        pushPinVertices = new List<Pushpin>();
        int i = 0;
        foreach (Microsoft.Maps.MapControl.WPF.Location vertice in selectedPoly.Locations)
        {
            Pushpin verticeBlock = new Pushpin();
            // I use a template to place a 'vertice marker' instead of a pushpin, il provide resource below
            verticeBlock.Template = (ControlTemplate)Application.Current.Resources["PushPinTemplate"];
            verticeBlock.Content = "vertice";
            verticeBlock.Location = vertice;
            verticeBlock.MouseDown += new MouseButtonEventHandler(pin_MouseDown);
            verticeBlock.MouseUp += new MouseButtonEventHandler(pin_MouseUp);
            myMap.Children.Add(verticeBlock);
            pushPinVertices.Add(verticeBlock);
            i++;

        }
    }

}



private void myMap_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == System.Windows.Input.Key.Escape)
    {
        if (_shapeEdit && selectedPoly != null)
        {

            foreach (Pushpin p in pushPinVertices)
            {
                myMap.Children.Remove(p);
            }

            _shapeEdit = false;
            selectedPoly = null;

        }

    }
}
// Note: I needed my window to pass bing maps the keydown event
private void Window_KeyDown(object sender, KeyEventArgs e)
{
    myMap_KeyDown(sender, e);
}


// === Editable polygon Events ===

// ==== Draggable pushpin events =====
Vector _mouseToMarker;
private bool _IsPinDragging;
public Pushpin SelectedPushpin { get; set; }

void pin_MouseUp(object sender, MouseButtonEventArgs e)
{
    LocationCollection locCol = new LocationCollection();
    foreach (Pushpin p in pushPinVertices)
    {
        locCol.Add(p.Location);

    }

    selectedPoly.Locations = locCol;
    bingMapRefresh();

    _IsPinDragging = false;
    SelectedPushpin = null;
}

void pin_MouseDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
    SelectedPushpin = (Pushpin)sender;
    _IsPinDragging = true;
    _mouseToMarker = Point.Subtract(
        myMap.LocationToViewportPoint(SelectedPushpin.Location),
        e.GetPosition(myMap));

}

private void myMap_MouseMove(object sender, MouseEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        if (_IsPinDragging && SelectedPushpin != null)
        {
            SelectedPushpin.Location = myMap.ViewportPointToLocation(Point.Add(e.GetPosition(myMap), _mouseToMarker));
            e.Handled = true;
        }
    }
}
// ==== Draggable pushpin events =====
// Nice little maprefresh I found online since the bingmap WPF doesnt always seem to update elements after certain event orders
private void bingMapRefresh()
{
    //myMap.UpdateLayout();
    var mapCenter = myMap.Center;
    mapCenter.Latitude += 0.00001;
    myMap.SetView(mapCenter, myMap.ZoomLevel);
}

画鋲アイコンを上書きするリソースについてはImageBrush、小さな白い四角を作ってみました。Marginマーカーを作成する長さ/幅によっては、プロパティを調整する必要がある場合があることに注意してください。これは、通常、画鋲がデフォルトで場所の上に固定されているためです。

<Application.Resources>
    <ControlTemplate x:Key="PushPinTemplate">
        <Grid>
            <Rectangle Width="10" Height="10" Margin="0 35 0 0">
                <Rectangle.Fill>
                    <ImageBrush ImageSource="pack://application:,,,/Images/DragIcon.gif"/>
                </Rectangle.Fill>
            </Rectangle>
        </Grid>
    </ControlTemplate>
</Application.Resources>
于 2012-10-02T19:34:23.583 に答える