拡張現実アプリで段階的に構築しています。以前、SearchLocation.xaml
number 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();
}