2011-01-01 8 views
1

私はプッシュピンの動きを地図上にドラッグして表示する方法を探しています。 ここで提案されている例を変更しようとしました: http://peteohanlon.wordpress.com/2010/10/10/draggable-pushpins/ MouseMoveイベントハンドラに追加されたデリゲートのAssociatedObject.Locationを更新することで、結果は得られません。プッシュピンは、マウスボタンを離す瞬間までその場所に留まります。その後、新しい場所にジャンプします。ドラッグ可能なプッシュピンをアニメーション化する方法

MapLayerがドラッグ中にプッシュピンの位置を追跡し、マウスの動きに合わせて適切に再描画するようにするにはどうすればよいですか?

+0

私がプッシュピンで同じ動作を使用するとXAMLの中にハードコーディングされたアプローチは期待と同じように動作します - 100%。だからおそらくバインドされたプッシュピン(MapItemsControl-ItemTemplate-DataTemplateを介して)の使用は責任を負うことです... –

+0

私は、犯人を見つけたと思います - それはContentPresenterです。プッシュピンが子供である瞬間、もはやアニメートされません。 –

答えて

1

最大、あなたがしたいことを明確にすることはできますか?あなたのアプローチは合理的ですが、マウスを動かすたびにピンの位置を再計算することは少し難しいでしょう。どのピンがドラッグモードに入ると、この?:

  1. のようなものについては、それがマップから削除されますとだけ、画面空間に存在するドラッグ可能なピンに置き換えます。そのため、ユーザーは画面スペース内で「ピン」をドラッグして、スペースをマップしません。

  2. ユーザーがドラッグを終了すると、画面の位置をマップ位置(Locationオブジェクト)に変換してマップに戻します。

+0

あなたの提案は実現可能ですが、おそらくその要件に答えるでしょう。私はこの動作を可能にする簡単な方法を見つけようとしていました。難しいXAMLコードのプッシュピンが使用されている場合、私の元のアプローチは問題ありません(コメントを参照)。 –

0

私自身の解決策を取りながらこのことが出てきました。注意するために、私は2Way MVVMバインディングパターンも使用していますが、完璧に動作します。

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)画鋲のドラッグイベントハンドラでは、その拡張メソッドを呼び出すあなたは、2つのことを必要とします非同期的に視覚的な更新を実行し、あなたにピンをドラッグで素敵なスライドの周りの挙動を与える必要があります

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(); 
     } 
    } 

を次のようにMapLayerをホスティングしている参照して、(UIElementから)最も麗しいInvalidateArrange方法をオフに発射します。 HTH

0

GestureListener上WP7用のSilverlight Toolkitのソリューションを使用する準備があります:

<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); 
} 
関連する問題