0

我正在我的增强现实应用程序中构建舞台。我之前使用了一个名为SearchLocation.xamlnumber 的页面来进行谷歌地理编码搜索,以查找经纬度的地方。

但是在我向我的应用程序添加更多功能(例如主 AR 页面)之后,我在尝试通过页面搜索一个地方的纬度时可疑地遇到了异常SearchLocation.xaml。它在方法之后立即命中InitializeComponent()。为了尝试查看导致此问题的原因,我添加了一个Loaded += SearchLocation_Loaded event,并且在SearchLocation_Loaded事件中,我将 ContentPanel 的可见性设置为可见(我将其可见性硬编码为在 xaml 中折叠)。

令我惊讶的是,每次 ContentPanel 出现在屏幕上时都会出现异常。如果我完全关闭应用程序并重新打开它,它第一次没有命中,但是当我第二次尝试打开时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 页面时,都会发生这种情况。

我还使用断点来查看在哪一行代码抛出异常,它是在 public SearchLocation() {} 中的每一行执行后立即抛出的。

更新:我设法了解导致此异常的原因。下面是两张截图,一张是第一次打开页面时的截图。另一个是页面再次打开时。我看到两个属性被设置为空。这两个都是故事板动画。我如何再次从 null 回到他们的故事板动画?

前: 前

后: 后

可以看到,页面第一次加载和第二次加载时没有变化。我现在完全不知道该做什么。

这是我的 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 回答