我正在我的增强现实应用程序中构建舞台。我之前使用了一个名为SearchLocation.xaml
number 的页面来进行谷歌地理编码搜索,以查找经纬度的地方。
但是在我向我的应用程序添加更多功能(例如主 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();
}