2010-12-13 9 views
2

Meine Bing Map-Anwendung stürzt schließlich ab, wenn ich ziehe oder zoome. Getestet auf Emulator und Gerät.WP7 - Bing Maps - Wie handhabe ich mehrere Pins auf einem MapItemsControl? - Absturz Anwendung

Ich habe das Oktober-Update installiert.

Bindung von MapItemsControl an ObservableCollection. Wenn die Anwendung startet, wurden Pins geladen und sind sichtbar.

Während der Fehlerbehebung stelle ich fest, dass die App nicht abstürzt, wenn sich die Pins auf der Karte im selben allgemeinen Bereich befinden. Beispiel

addPin("40.78184126814031", "-73.97712707519532");  
addPin("40.74569634433956", "-73.96717071533204");  
addPin("40.7117682299881", "-74.0125322341919");  
addPin("40.75777392583087", "-73.96950960159302"); 

Aber wenn die Stifte verteilt sind - die Anwendung abstürzt, wenn der Benutzer in einem bestimmten Stift zoomt und/oder die Karte verschieben. Beispiel

addPin("42.35960626034072", "-71.09212160110473");  
addPin("51.388066116760086", "30.098590850830067");  
addPin("48.17972265679143", "11.54910385608672");  
addPin("40.28802528051879", "-76.65668606758117"); 

nicht sicher, ob der Projektcode ist notwendig - ich dort gehe davon einige Konzepte, das ich weiß einfach nicht.

Irgendwelche Vorschläge - ich bin ganz Ohr. Stapelspur unten.

Dank

Unspecified error 
    at MS.Internal.XcpImports.CheckHResult(UInt32 hr)  
    at MS.Internal.XcpImports.UIElement_HitTestPoint(UIElement element, Point ptHit)  
    at System.Windows.UIElement.HitTest(Point point)  
    at System.Windows.Media.VisualTreeHelper.FindElementsInHostCoordinates(Point intersectingPoint, UIElement subtree)  
    at Microsoft.Phone.Controls.Maps.Core.TouchHelper.<InputHitTest>d__0.MoveNext()  
    at Microsoft.Phone.Controls.Maps.Core.TouchHelper.HitTestAndRaiseDownEvent(UIElement root, TouchPoint touchPoint)  
    at Microsoft.Phone.Controls.Maps.Core.TouchHelper.TouchFrameReported(Object sender, TouchFrameEventArgs e)  
    at System.Windows.Input.Touch.OnTouch(Object sender, TouchFrameEventArgs e)  
    at MS.Internal.JoltHelper.RaiseEvent(IntPtr target, UInt32 eventId, IntPtr coreEventArgs, UInt32 eventArgsTypeIndex) 

Dachte, es am besten, um den Code enthalten - diese laufen und in Abstürze App Zoomen - dank

PINDATA Klasse

namespace BugCrash.models 
{public class PinData{public GeoCoordinate PinLocation { get;set; }}} 

MainPage.xaml.cs

namespace BugCrash 
{ 
    public partial class MainPage : PhoneApplicationPage 
    { 
     private ObservableCollection<PinData> _pinsA = new ObservableCollection<PinData>(); 
     public ObservableCollection<PinData> PinsA { get { return this._pinsA; } } 

     // Constructor 
     public MainPage() 
     { 
      InitializeComponent(); 
      this.DataContext = this; 
      myMap.Center = new GeoCoordinate(40.74569634433956, -73.96717071533204); 
      myMap.ZoomLevel = 4; 
      MessageBox.Show(loadAPins_fromString()); 
     } 

     //ADD PIN TO COLLECTION 
    private void addPin(String lat, String lon) 
    { 
     PinData tmpPin; 
     tmpPin = new PinData() { PinLocation = new GeoCoordinate(System.Convert.ToDouble(lat), System.Convert.ToDouble(lon)) }; 
     _pinsA.Add(tmpPin); 
    }  
     //LOAD PINS ONE BY ONE 
     private string loadAPins_fromString() 
     { 
      //BAD 
      addPin("42.35960626034072", "-71.09212160110473"); 
      addPin("51.388066116760086", "30.098590850830067"); 
      addPin("48.17972265679143", "11.54910385608672"); 
      addPin("40.28802528051879", "-76.65668606758117"); 
      return "A PINS LOADED - STRING"; 
     } 
    } 
} 

MainPage.xaml

<phone:PhoneApplicationPage 
    x:Class="BugCrash.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" 
    FontFamily="{StaticResource PhoneFontFamilyNormal}" 
    FontSize="{StaticResource PhoneFontSizeNormal}" 
    Foreground="{StaticResource PhoneForegroundBrush}" 
    SupportedOrientations="Portrait" Orientation="Portrait" 
    shell:SystemTray.IsVisible="False" 
    xmlns:my="clr-namespace:Microsoft.Phone.Controls.Maps;assembly=Microsoft.Phone.Controls.Maps"> 

    <Grid x:Name="LayoutRoot" Background="Transparent"> 
     <!--RESOURCES--> 
     <Grid.Resources> 
      <my:ApplicationIdCredentialsProvider ApplicationId="XX" x:Key="MyCredentials"/> 
     </Grid.Resources> 
     <my:Map Height="768"    
       Name="myMap" 
       VerticalAlignment="Top" Width="480" 
       CredentialsProvider="{StaticResource MyCredentials}"> 
      <my:Map.Mode> 
       <my:AerialMode ShouldDisplayLabels="True" /> 
      </my:Map.Mode> 

      <my:MapItemsControl 
        x:Name="GroupAPins" 
        ItemsSource="{Binding PinsA}"     
        > 
       <my:MapItemsControl.ItemTemplate> 
        <DataTemplate> 
         <my:Pushpin Location="{Binding PinLocation}" Width="60" Height="55" Content="PIN"> 
         </my:Pushpin> 
        </DataTemplate> 
       </my:MapItemsControl.ItemTemplate> 
      </my:MapItemsControl> 
     </my:Map> 
    </Grid> 
</phone:PhoneApplicationPage> 

Antwort

5

Ich musste Microsoft gehen, um eine Antwort auf diese zu erhalten. Es stellt sich heraus, dass es einen Fehler im Kartensteuerelement gibt. Um diesen Fehler zu umgehen - laden Sie das Bing Map Control dynamisch.

Änderungen sind wie folgt,

public MainPage() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
     //Create a map. 
     Map MyMap = new Map(); 
     MyMap.CredentialsProvider = new ApplicationIdCredentialsProvider("XX"); 

     //Remove the List of items from the resource and add it to the map 
     this.LayoutRoot.Resources.Remove("GroupAPins"); 
     MyMap.Children.Add(GroupAPins); 

     MyMap.Center = new GeoCoordinate(40.74569634433956, -73.96717071533204); 
     MyMap.ZoomLevel = 5; 

     //Add the map to the content panel. 
     ContentPanel.Children.Add(MyMap); 
     loadAPins_fromString(); 
    } 

und die XAML,

<Grid x:Name="LayoutRoot" Background="Transparent"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <!--RESOURCES--> 
    <Grid.Resources> 
     <DataTemplate x:Key="LogoTemplate"> 
      <my:Pushpin Location="{Binding PinLocation}" /> 
     </DataTemplate> 
     <my:MapItemsControl x:Name="GroupAPins" 
        ItemTemplate="{StaticResource LogoTemplate}" 
        ItemsSource="{Binding PinsA}"> 
     </my:MapItemsControl> 
    </Grid.Resources> 
    <Grid x:Name="ContentPanel" Grid.Row="0" Margin="12,0,12,0"/> 
</Grid> 
+0

Hat mir nicht geholfen ... immer noch stürzt meine Anwendung ab. – Praneeth

4

Ahhh Code zu schreiben. Ich kann verhindern, dass die App abstürzt, indem ich die Breite und Höhe des PINs entferne.

Die Microsoft-Lösung enthielt keine PIN und Höhe - so nahm ich an, dass das Erstellen der Map-Steuerelement dynamisch war die Antwort - aber die Breite und Höhe hinzufügen - der gleiche Absturz wie meine ursprüngliche App.

Ich muss meinen Code zurück in die ursprüngliche Version mit dem Map-Steuerelement in der XAML ändern - und entfernen Sie die PIN und Höhe, um zu sehen, ob es beide Versionen löst - aber das scheint das Problem zu sein - meine App ist jetzt läuft gut - dynamisch erstellte Kartensteuerung - Pin ohne Breite oder Höhe.

Wie auch immer - hoffe, das hilft jemandem.

-D

+0

Ich habe gerade meine App diese Ausnahme werfen lassen. Ich setze weder die Breite noch die Höhe der Reißzwecke, obwohl die Pins als Untersteuerelemente mit BorderThickness = "0" Padding = "0" gesetzt sind. –

Verwandte Themen