C# &引用;对象引用未设置为对象的实例;第二次加载xaml页面并多次尝试时命中

C# &引用;对象引用未设置为对象的实例;第二次加载xaml页面并多次尝试时命中,c#,visual-studio-2012,windows-phone-8,augmented-reality,C#,Visual Studio 2012,Windows Phone 8,Augmented Reality,我正在我的增强现实应用程序中构建舞台智能。我以前曾多次使用名为SearchLocation.xaml的页面进行谷歌地理编码搜索,以查找大量的地点 但是,在我的应用程序中添加了更多功能(如主AR页面)之后,我怀疑在尝试通过SearchLocation.xaml页面搜索某个地方的lat时遇到了异常。它正好在InitializeComponent()方法之后出现。为了尝试查看导致这种情况的原因,我添加了一个Loaded+=SearchLocation\u Loaded事件,在SearchLocatio

我正在我的增强现实应用程序中构建舞台智能。我以前曾多次使用名为
SearchLocation.xaml
的页面进行谷歌地理编码搜索,以查找大量的地点

但是,在我的应用程序中添加了更多功能(如主AR页面)之后,我怀疑在尝试通过
SearchLocation.xaml
页面搜索某个地方的lat时遇到了异常。它正好在
InitializeComponent()
方法之后出现。为了尝试查看导致这种情况的原因,我添加了一个
Loaded+=SearchLocation\u Loaded事件
,在
SearchLocation\u Loaded
事件中,我将ContentPanel的可见性设置为visible(我在xaml中将其可见性硬编码为collapsed)

令我惊讶的是,每当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页面进行第二次、第三次或更多尝试时,就会发生这种情况

我还使用断点来查看异常抛出的代码行,它是在publicsearchLocation(){}中的everyline执行之后抛出的

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

之前:

之后:

正如您所看到的,当页面第一次和第二次加载时没有变化。我现在完全不知道该怎么办

这是我的InitializeComponent()中的内容

故事板:

<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();
    }
private async void Search\u点击(对象发送方,System.Windows.Input.GestureEventArgs e)
{
HideTextBlock.Begin();
SystemTray.ProgressIndicator=新的ProgressIndicator();
设置进程指示器(真);
SystemTray.ProgressIndicator.Text=“搜索”;
字符串searchText=searchText.Text;
HideTextBlock.Stop();
//强制执行字符串检查算法
searchText=searchText.Replace(“,“+”);
//http://maps.googleapis.com/maps/api/geocode/json?address=1600+圆形剧场+公园道,+山景,+CA和传感器=正确或错误
HttpClient=新的HttpClient();
字符串url=”http://maps.googleapis.com/maps/api/geocode/json"+
“?地址={0}”+
“&sensor=false”;
string baseUrl=string.Format(url,searchText);
string googleResult=await client.GetStringAsync(baseUrl);
SystemTray.ProgressIndicator.Text=“完成”;
设置进程指示器(假);
GoogleData apiData=JsonConvert.DeserializeObject(googleResult);
如果(apiData.status==“正常”)
{
HelpText.Visibility=Visibility.Collapsed;
foreach(apiData.results中的结果数据)
{
纬度=data.geometry.location.lat;
经度=data.geometry.location.lng;
foreach(数据中的AddressComponent addressData.address\u components)
{
locationName=addressData.long\u名称;
打破
}
}
var mapCenter=新地理坐标(纬度、经度);
MapLayer myLayer=新的MapLayer();
图钉=新图钉();
pin.Content=位置名称;
//pin.geocordinate=地图中心;
pin.geocordinate=地图中心;
MapOverlay myOverlay=新的MapOverlay();
myOverlay.Content=pin;
myOverlay.geocordinate=地图中心;
myOverlay.PositionOrigin=新点(0,1);
添加(myOverlay);
LocationMap.Visibility=可见性.Visibility;
LocationMap.Layers.Add(myLayer);
LocationMap.Center=地图中心;
LocationMap.ZoomLevel=10;
}
其他的
MessageBox.Show(“请输入要搜索的地名”);
UnhideTextBlock.Begin();
UnhideTextBlock.Stop();
}

没关系。我做了大量的研究,我发现是什么给了我这个例外。在导航到SearchLocation.xaml的页面中,有一个异步任务是GetGeopositionAsync

如果我在AddLocation.xaml页面等待获取地理位置,当我导航到SearchLocation.xaml页面时,它不会引发任何异常


因此,每当我离开页面时,我需要发出一个取消令牌。而且它有效

共享您尝试过的代码,其中的对象引用未设置为对象Throwing的实例。我添加了代码。在contentpanel显示在屏幕上之后立即引发异常。有时几秒钟后,异常会发生在哪里?调试器应突出显示路径。请提供路径抛出的位置。我更新了问题并添加了异常抛出的位置。
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();
    }