1

私の質問は、Windows Phone 7 で bing マップを使用することについてです。

  • x 秒ごとにサービスをポーリングして座標のセットを取得する
  • サービスが初めてポーリングされる場合

    • これらの座標をカスタム画鋲として地図上にプロットします (私は Image と MapLayer を使用しています)

      PinObject pin = new PinObject() //Custom object
                      {
                          Id = groupMember.Id,
                          PushPin = new Image()
                          {
                              Source = new System.Windows.Media.Imaging.BitmapImage(new Uri("blackpin.png", UriKind.Relative)),
                              Opacity = 0.8,
                              Stretch = System.Windows.Media.Stretch.None
                          },
                          PinLocation = new GeoCoordinate(groupMember.Latitude, groupMember.Longitude)
                      }; 
      imageLayer.AddChild(pin.PushPin, pin.PinLocation); //Initialized in constructor
                      pinObjects.Add(pin);// Add pin object to a list to provide a handle to the objects
      
    • マップのズームレベルを自動設定して、プロットされたすべてのポイントが表示されるようにします(LocationRect.CreateLocationRectを使用する必要があると思います)

                  var coords = pinObjects.Select(p => p.PinLocation).ToList();                        
                  myMap.SetView(LocationRect.CreateLocationRect(coords));
      
    • それ以外の場合は、取得した新しい座標に基づいて、マップ上の各画鋲の位置を更新します。 PinObject pObj = pinObjects.FirstOrDefault(p => p.Id == groupMember.Id);

       MapLayer.SetPosition(pObj.PushPin, new GeoCoordinate(groupMember.Latitude, groupMember.Longitude));
      

ピンは適切にロードされ、新しい位置を取得するためのサービスへの呼び出しも正常にロードされます。問題は、マップ上の位置が更新されないため、基本的に、すべての作業がバックグラウンドで行われているにもかかわらず、ピンがじっと座っていることです。デバッグしたので、動作することがわかりました。ピンの位置をリセットするにはどうすればよいですか? イメージを使用しても問題が解決しない場合、画鋲オブジェクトを使用できますか? これはどのように機能しますか?

前もって感謝します。

4

3 に答える 3

0

画鋲を確実に更新するための最良の方法はSetView()、地図上でもう一度callを呼び出すことです。基本的に更新を強制するために、既存のビューを渡すことができます。例えば;MyMapControl.SetView(MyMapControl.BoundingRectangle);

于 2012-04-05T01:59:42.237 に答える
0

これは Dispatcher.BeginInvoke に似たオプションですが、場合によってはうまく機能します。いくつかの作業で現在のスレッドから抜け出す必要がある場合は、プライベートな静的クラス UICallbackTimer を使用して実行をわずかにオフセットします。(タイプミスとテストされていないコード、ここで断片を引き出すだけで、コードでデバッグする必要があります)

UICallbackTimer は私のコードではありませんが、インターネットで入手できます。「private static class UICallbackTimer」を検索すると、このクラスに関する情報を取得できます。

これを実行するコードは次のとおりです。

UICallbackTimer.DelayExecution(TimeSpan.FromSeconds(.01),
                                       () => (

MapLayer.SetPosition(pObj.PushPin, new GeoCoordinate(groupMember.Latitude, groupMember.Longitude))

);

これがクラスです(現在のオブジェクト内に配置して、クラスに対してプライベートのままにします)System.Threadingのusingステートメントを追加します

private static class UICallbackTimer
    {
        private static bool _running = false;
        private static int runawayCounter = 0;

        public static bool running()
        {
            if (_running && runawayCounter++ < 10)
                return _running;

            runawayCounter = 0;
            _running = false;
            return _running;
        }

        public static void DelayExecution(TimeSpan delay, Action action)
        {
            _running = true;
            System.Threading.Timer timer = null;
            SynchronizationContext context = SynchronizationContext.Current;
            timer = new System.Threading.Timer(
                (ignore) =>
                {
                    timer.Dispose();
                    _running = false;
                    context.Post(ignore2 => action(), null);
                }, null, delay, TimeSpan.FromMilliseconds(-1));
        }
    }
于 2012-04-06T13:48:24.863 に答える