6

Map.SetView()関数を呼び出す必要があるページのライフサイクルの特定の時間はありますか?私たちのアプリでは、これをさまざまなマップオブジェクトで使用しており、ランダムに、場合によっては完全に、場合によっては効果がなく、例外なく機能するようです。

サンプルコード:

RouteMap.SetView(LocationRectangle.CreateBoundingRectangle(DirectionCoordinates));

ここで、RouteMapはマッピングコンポーネントであり、DirectionCoordinatesにはマップの開始/終了座標が含まれています。

バウンディングボックスが適切に作成されていることはわかりますが、同じデータを読み込んでも、マップの位置が常に影響を受けるとは限りません。ブレークポイントを追加すると機能するように見えるので、マップの読み込みと関係があると思いましたが、 LoadedイベントにSetView()機能を追加しても同じ問題が発生します。現在、ページLoa​​dedイベントで地図情報を処理しています。

アップデート

私はさらにテストを行い、可能なことにイベントを追加しました。MapLoadedイベントがSetViewの前に呼び出されていることを知っています。SetViewが呼び出された後、それは時々機能し、他では機能しません。ViewChangingイベントもViewChangedイベントも呼び出されません。

4

7 に答える 7

4

これは明らかに最善の解決策ではありませんが、Loadedイベントが呼び出されたときに、ロードが完了していないために、ロードが完了していないものが存在する必要があります。

Map_Loadedイベントに100msのスリープを追加しましたが、これで問題は解決しました。

System.Threading.Thread.Sleep(500);

アップデート

100msが機能しない人もいます。200、500などの数値を試してみることをお勧めします。それでも、マップの読み込み時間の遅延は非常に短いです。私はこれについてマイクロソフトに連絡しました、そして彼らは彼らが問題を調査していると私に言いました、そして私達はうまくいけば彼らからある種の応答があるでしょう。

更新および編集

UIがハングしないように、代わりに次のコードを使用してください。

await Task.Delay(250);
于 2012-11-30T17:17:27.780 に答える
3

ResolveCompletedイベントとブールフラグを使用してこの問題に取り組みました。

private void Map_ResolveCompleted(object sender, MapResolveCompletedEventArgs e)
    {
        if (this.zoomReq)
        {
            this.zoomReq = false;
            if (this.locationList != null && this.locationList.Count > 0)
            {
                var viewRect = LocationRectangle.CreateBoundingRectangle(this.locationList);
                this.Map.SetView(viewRect);
            }
        }
    }   

マップがズームする前に目立った一時停止がありますが、少なくともこれは常に機能しているようです。ResolveCompletedマップが移動するたびに発砲されるため、フラグが必要です。

于 2014-12-12T14:38:19.540 に答える
2

私は、マップレイヤー( )を作成することと、メソッドでMicrosoft.Phone.Maps.Controls.MapLayerビュー()を設定することの両方を行っていました。public void SetView(LocationRectangle boundingRectangle);async

public async Task CreateMap()
{
    map.Add(mapLayer);
    map.SetView(locationRectangle);
}

読み込みを行っていたので、を使用しasyncました。

これにより、最初にページに移動したときに、ビューが1回だけ設定されます。

解決策は、setview呼び出しをディスパッチすることでした。

public async Task CreateMap()
{
    map.Add(mapLayer);
    Dispatcher.BeginInvoke(() =>
            {
                map.SetView(locationRectangle);
            });
}

お役に立てば幸いです。

于 2013-03-08T04:36:04.367 に答える
0

Loadedイベントは、SetView()の適切な場所です。OnNavigatedToメソッドで長方形を作成してみてください。場所を操作しているときは、常にOnNavigatedToでウォッチャーを起動し、_Loadedの任意のマップレイヤーを操作します。

于 2012-11-27T23:16:15.420 に答える
0

私はこの問題にしばらく取り組んだ。ページのコンストラクターにロードするもののほとんどを入れるのは役に立ちませんでした。でトリックを試みましたSystem.Threading.Thread.Sleep(500)が、有効になるまでに500ミリ秒をはるかに超えてかかり、これは私には受け入れられませんでした。ZoomLevelChanged一部の人々にとっては、イベントをトリガーしてビューを設定するのに役立ちました。私自身は、「ViewChanging」イベントをDispatcherTimer使用して起動し、タイマーを停止しました。SetView()アニメーションを使用する場合、違いはかなり小さいです。

于 2013-09-06T02:23:10.503 に答える
0

私はこの問題を抱えていましMapAnimationKind.Linearたが、MapAnimationKind.Noneそれは問題なく動作します

map.SetView(LocationRectangle.CreateBoundingRectangle(...), MapAnimationKind.None);
于 2014-05-27T07:59:07.090 に答える
0

私は非常によく似た問題を抱えていました。基本的に、マップのセットビューは、ページが最初に読み込まれたとき(つまり、すべてのデータの読み込みが完了した後)に機能しますが、ページを離れて戻ってきて、すべてのデータを再読み込みする必要がない場合は、機能しませんでした。デバッグ中、ロードが完了する前にマップの情報を設定しているように見えました。

だから私が挑戦を解決するためにしたことは:

  1. XAMLで-マップのLoadedイベントのイベントハンドラーを追加しました。例:Loaded = "myMap_Loaded"
  2. myMap_Loadedイベントでは、asyncメソッドを呼び出して、データが読み込まれるのを待ってからマップしました。
    例:

private void myMap_Loaded(object sender、RoutedEventArgs e){WaitAndLoadMap(); }

  1. データの読み込みが完了するのを待ってからマップを読み込むように、WaitAndLoadMapメソッドをコーディングしました。
private async void WaitAndLoadMap()
    {
        //Check if the data is loaded and if it is not - loop. 
        while (!App.NearbyLocationsViewModel.IsLocationDataLoaded)
            await Task.Delay(250);

        //Load the map content and set the mapview.
    }

動作しているようです。これが他の人に役立つことを願っています。

于 2014-11-18T00:06:23.517 に答える