0

拡張現実アプリで段階的に構築しています。以前、SearchLocation.xamlnumber of times という名前のページを使用して、緯度経度の場所を見つけるために Google ジオコーディング検索を実行しました。

しかし、メインの AR ページなどの機能をアプリに追加した後、ページで場所の緯度経度を検索しようとすると、疑わしい例外が発生しSearchLocation.xamlます。InitializeComponent()メソッドの直後にヒットします。これを引き起こしている原因を確認するためLoaded += SearchLocation_Loaded eventに、SearchLocation_Loadedイベントに追加し、ContentPanel の可視性を可視に設定しています (xaml で可視性を折りたたむようにハードコーディングしました)。

驚いたことに、ContentPanel が画面に表示されるたびに例外が発生します。アプリを完全に閉じて再度開くと、最初はヒットしませんが、2回目に開こうとするとSearchLocation.xaml(他のページのボタンのタップイベントにリンクしました)、例外が発生しました。そしてアプリが閉じます。

私はこれを引き起こしているものについて完全に無知です。この例外を取り除くために、誰かが正しい方法で私を導くことができますか??

必要に応じて、コード スニペットが提供されます。

public SearchLocation()
{
    InitializeComponent();
    Loaded += SearchLocation_Loaded;
}

void SearchLocation_Loaded(object sender, RoutedEventArgs e)
{
    ContentPanel.Visibility = Visibility.Visible;
}

ハンドルされていないため、ここで例外がスローされます。

private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
    {
        if (Debugger.IsAttached)
        {
            // An unhandled exception has occurred; break into the debugger
            MessageBox.Show(e.ExceptionObject.Message);
            Debugger.Break();
        }
    }

AddLocation.xaml からボタンをタップして SearchLocation.xaml ページを開くたびに、2 回目、3 回目、またはそれ以上の試行で発生します。

また、ブレークポイントを使用して、コードのどの行で例外がスローされているかを確認しました。パブリック SearchLocation() {} のすべての行が実行された直後に例外がスローされています。

更新: この例外の原因を理解することができました。以下に 2 つのスクリーンショットを示します。1 つは、ページが初めて開いたときに撮影されたものです。もう 1 つは、ページが再び開いたときです。2 つのプロパティが null に設定されていることがわかりました。どちらもストーリーボード アニメーションです。null からストーリーボード アニメーションに戻すにはどうすればよいですか?

前: 前

後: 後

ご覧のとおり、ページが最初に読み込まれたときと 2 回目に読み込まれたときに変化はありません。私は今、何をすべきか完全に無知です。

これは、私の InitializeComponent() の内容です。

public void InitializeComponent() {
        if (_contentLoaded) {
            return;
        }
        _contentLoaded = true;
        System.Windows.Application.LoadComponent(this, new System.Uri("/FindIt;component/SearchLocation.xaml", System.UriKind.Relative));
        this.HideTextBlock = ((System.Windows.Media.Animation.Storyboard)(this.FindName("HideTextBlock")));
        this.UnhideTextBlock = ((System.Windows.Media.Animation.Storyboard)(this.FindName("UnhideTextBlock")));
        this.LayoutRoot = ((System.Windows.Controls.Grid)(this.FindName("LayoutRoot")));
        this.ContentPanel = ((System.Windows.Controls.Grid)(this.FindName("ContentPanel")));
        this.HelpText = ((System.Windows.Controls.TextBlock)(this.FindName("HelpText")));
        this.SearchText = ((System.Windows.Controls.TextBox)(this.FindName("SearchText")));
        this.Search = ((System.Windows.Controls.Button)(this.FindName("Search")));
        this.Add = ((System.Windows.Controls.Button)(this.FindName("Add")));
        this.LocationMap = ((Microsoft.Phone.Maps.Controls.Map)(this.FindName("LocationMap")));
    }

ストーリーボード:

<phone:PhoneApplicationPage.Resources>
    <Storyboard x:Name="HideTextBlock">
        <DoubleAnimation 
            Duration="0:0:0.4"
            From="120"
            To="0"
            Storyboard.TargetProperty="Height"
            Storyboard.TargetName="HelpText"
            d:IsOptimized="True" />
    </Storyboard>
    <Storyboard x:Name="UnhideTextBlock">
        <DoubleAnimation
            Duration="0:0:0.4" 
            From="0"
            To="120"
            Storyboard.TargetProperty="Height"
            Storyboard.TargetName="HelpText"
            d:IsOptimized="True" />
    </Storyboard>
</phone:PhoneApplicationPage.Resources>

ストーリーボードが開始されるメソッド:

private async void Search_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    {
        HideTextBlock.Begin();
        SystemTray.ProgressIndicator = new ProgressIndicator();

        SetProgressIndicator(true);
        SystemTray.ProgressIndicator.Text = "Searching";

        string searchText = SearchText.Text;
        HideTextBlock.Stop();
        //Enforce string checking algorithms

        searchText = searchText.Replace(" ", "+");
        //http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=true_or_false

        HttpClient client = new HttpClient();

        string url = "http://maps.googleapis.com/maps/api/geocode/json"+
            "?address={0}"+
            "&sensor=false";
        string baseUrl = string.Format(url, searchText);

        string googleResult = await client.GetStringAsync(baseUrl);
        SystemTray.ProgressIndicator.Text = "Done";
        SetProgressIndicator(false);

        GoogleData apiData = JsonConvert.DeserializeObject<GoogleData>(googleResult);

        if (apiData.status == "OK")
        {
            HelpText.Visibility = Visibility.Collapsed;

            foreach (Result data in apiData.results)
            {
                latitude = data.geometry.location.lat;
                longitude = data.geometry.location.lng;

                foreach (AddressComponent addressData in data.address_components)
                {
                    locationName = addressData.long_name;
                    break;
                }
            }
            var mapCenter = new GeoCoordinate(latitude, longitude);
            MapLayer myLayer = new MapLayer();
            Pushpin pin = new Pushpin();

            pin.Content = locationName;

            //pin.GeoCoordinate = mapCenter;
            pin.GeoCoordinate = mapCenter;

            MapOverlay myOverlay = new MapOverlay();
            myOverlay.Content = pin;
            myOverlay.GeoCoordinate = mapCenter;
            myOverlay.PositionOrigin = new Point(0, 1);
            myLayer.Add(myOverlay);

            LocationMap.Visibility = Visibility.Visible;
            LocationMap.Layers.Add(myLayer);
            LocationMap.Center = mapCenter;
            LocationMap.ZoomLevel = 10;

        }
        else
            MessageBox.Show("Please enter a place name to search");
        UnhideTextBlock.Begin();
        UnhideTextBlock.Stop();
    }
4

1 に答える 1

0

どうでも。私はかなりの量の調査を行い、この例外を与えているものを見つけました。SearchLocation.xaml に移動しているページに GetGeopositionAsync という非同期タスクがあります。

地理位置情報が取得されるまで AddLocation.xaml ページで待機すると、SearchLocation.xaml ページに移動しても例外がスローされません。

そのため、ページから移動するたびにキャンセル トークンを発行する必要があります。そして、それはうまくいきます!

于 2013-09-14T09:19:11.903 に答える