地図上で押しピンをドラッグする動きを表示する方法を探しています。ここで提案されている例を変更しようとしました : http://peteohanlon.wordpress.com/2010/10/10/draggable-pushpins/ . 押しピンは、マウス ボタンを離すまでその場所にとどまります。次に、新しい場所にジャンプします。
ドラッグ中にMapLayerにプッシュピンの位置を追跡させ、マウスの動きに合わせて適切に再描画させるにはどうすればよいですか?
地図上で押しピンをドラッグする動きを表示する方法を探しています。ここで提案されている例を変更しようとしました : http://peteohanlon.wordpress.com/2010/10/10/draggable-pushpins/ . 押しピンは、マウス ボタンを離すまでその場所にとどまります。次に、新しい場所にジャンプします。
ドラッグ中にMapLayerにプッシュピンの位置を追跡させ、マウスの動きに合わせて適切に再描画させるにはどうすればよいですか?
マックス、あなたがやりたいことをはっきりさせてもらえますか? ここでのアプローチは合理的に聞こえますが、マウスが動くたびにマップにピンの位置を再計算させるのは少し不要です. このようなものはどうですか?:
ピンがドラッグ モードになると、ピンはマップから削除され、画面スペースにのみ存在するドラッグ可能なピンに置き換えられます。したがって、ユーザーはマップ空間ではなく、画面空間で「ピン」をドラッグしています。
ユーザーがドラッグを終了すると、画面の位置をマップの位置 (Location オブジェクト) に変換し、それをマップに戻します。
WP7 の Silverlight Toolkit には、GestureListener を介してすぐに使用できるソリューションがあります。
<my:Pushpin Location="{Binding Location}">
<toolkit:GestureService.GestureListener>
<toolkit:GestureListener DragDelta="GestureListener_DragDelta" DragStarted="GestureListener_DragStarted" DragCompleted="GestureListener_DragCompleted"/>
</toolkit:GestureService.GestureListener>
</my:Pushpin>
private void GestureListener_DragStarted(object sender, DragStartedGestureEventArgs e)
{
Map.IsEnabled = false;
}
private void GestureListener_DragCompleted(object sender, DragCompletedGestureEventArgs e)
{
Map.IsEnabled = true;
}
private void GestureListener_DragDelta(object sender, DragDeltaGestureEventArgs e)
{
Point p = e.GetPosition(Map);
App.ViewModel.Location = Map.ViewportPointToLocation(p);
}
私は自分のソリューションを作成しているときにこれに出くわしました.投稿したいと思ったのと同じように機能するのを見てとてもうれしかったです. 注目すべきは、私は 2Way MVVM Binding パターンも使用しており、問題なく動作することです。次の 2 つが必要です。
1) 実行時にピンの親である MapLayer を見つけるのに役立つこの拡張メソッド:
public static T FindVisualParent<T>(this DependencyObject obj)
where T : DependencyObject
{
DependencyObject parent = VisualTreeHelper.GetParent(obj);
while (parent != null)
{
T typed = parent as T;
if (typed != null)
{
return typed;
}
parent = VisualTreeHelper.GetParent(parent);
}
return null;
}
2) 画鋲の Dragging イベント ハンドラーで、その拡張メソッドを呼び出してホスティング MapLayer を参照し、次に最も美しい InvalidateArrange メソッド (UIElement から) を次のように起動します。
void ParentMap_MouseMove(object sender, MouseEventArgs e)
{
var map = sender as Microsoft.Maps.MapControl.Map;
var parentLayer = this.FindVisualParent<MapLayer>();
if (this.isDragging)
{
var mouseMapPosition = e.GetPosition(map);
var mouseGeocode = map.ViewportPointToLocation(mouseMapPosition);
this.Location = mouseGeocode;
parentLayer.InvalidateArrange();
}
}
これにより、視覚的な更新が非同期で実行され、ピンのドラッグ時に適切なスライド アラウンド動作が得られます。HTH