2 Stimmen

WP7 - Bing Maps - Wie behandle ich mehrere Pushpins auf einem MapItemsControl? - Anwendung stürzt derzeit ab

Meine Bing-Kartenanwendung stürzt irgendwann ab, wenn ich ziehe oder zoome. Getestet auf Emulator und Gerät.

Ich habe das Oktober-Update installiert.

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

Bei der Fehlersuche stelle ich fest, dass die App nicht abstürzt, wenn sich die Stecknadeln auf der Karte in demselben allgemeinen Bereich befinden. Beispiel,

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

Sind die Pins jedoch verteilt, stürzt die Anwendung ab, wenn der Benutzer auf einen bestimmten Pin zoomt und/oder die Karte zieht. Beispiel,

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

Ich bin mir nicht sicher, ob der Projektcode notwendig ist - ich gehe davon aus, dass es ein Konzept gibt, das ich einfach nicht kenne.

Für Vorschläge bin ich immer offen. Stack Trace unten.

Danke

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)

Ich dachte, es wäre am besten, den Code mit einzubinden - wenn ich diesen ausführe und hineinzoome, stürzt die App ab - danke

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>

5voto

Dave Punkte 123

Ich musste mich an Microsoft wenden, um eine Antwort auf diese Frage zu erhalten. Es stellte sich heraus, dass es einen Fehler in der Kartensteuerung gibt. Um diesen Fehler zu umgehen - laden Sie die Bing Map Control dynamisch.

Die Ä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>

4voto

Dave Punkte 123

Ahhh, Code schreiben. Es stellt sich heraus, dass ich die App vor dem Absturz bewahren kann, indem ich die Breite und Höhe der Stecknadel entferne.

Die Microsoft-Lösung enthielt keine Pushpin-Breite und -Höhe - also nahm ich an, dass das dynamische Erstellen des Kartensteuerelements die Antwort war - aber das Hinzufügen der Breite und Höhe - gleicher Absturz wie meine ursprüngliche App.

Ich muss meinen Code wieder auf die ursprüngliche Version mit der Karte-Steuerelement in der XAML ändern - und entfernen Sie die Pushpin-Breite und Höhe, um zu sehen, wenn es beide Versionen löst - aber dies scheint das Problem zu sein - meine app läuft jetzt gut - dynamisch erstellte Karte-Steuerelement - Pushpin mit keine Breite oder Höhe.

Wie auch immer - ich hoffe, das hilft jemandem.

-D

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X