【问题标题】:WP7 - Bing Maps - How do I handle multiple pushpins on a MapItemsControl? - currently crashing applicationWP7 - Bing 地图 - 如何处理 MapItemsControl 上的多个图钉? - 当前崩溃的应用程序
【发布时间】:2010-12-18 06:17:00
【问题描述】:

当我拖动或缩放时,我的 bing 地图应用程序最终会崩溃。在模拟器和设备上测试。

我已安装 10 月更新。

MapItemsControl 绑定到 ObservableCollection。 当应用程序启动时,引脚已加载并可见。

在进行故障排除时,我确定如果地图上的图钉位于同一大致区域,应用程序不会崩溃。例如,

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

但如果图钉散开 - 当用户放大某个特定图钉和/或拖动地图时,应用程序会崩溃。例如,

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

不确定项目代码是否必要 - 我假设有一些我不知道的概念。

任何建议 - 我都在听。 下面的堆栈跟踪。

谢谢

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)

认为最好包含代码 - 运行它并放大崩溃应用程序 - 谢谢

PINDATA 类

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>

【问题讨论】:

    标签: windows-phone-7 bing-maps


    【解决方案1】:

    我不得不去微软那里得到答案。 原来地图控件中存在错误。 要解决此错误 - 动态加载 bing 地图控件。

    变化如下,

        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();
        }
    

    和 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>
    

    【讨论】:

    • 没有帮助我...我的应用程序仍然崩溃。
    【解决方案2】:

    啊啊写代码。 事实证明,我可以通过移除图钉的宽度和高度来防止应用崩溃。

    Microsoft 解决方案不包括图钉宽度和高度 - 所以我认为动态创建地图控件是答案 - 但添加宽度和高度 - 与我的原始应用程序相同的崩溃。

    我需要使用 XAML 中的地图控件将我的代码更改回原始版本 - 并删除图钉宽度和高度以查看它是否解决了这两个版本 - 但这似乎是问题所在 - 我的应用程序现在正在运行很好 - 动态创建的地图控件 - 没有宽度或高度的图钉。

    无论如何-希望这对某人有所帮助。

    -D

    【讨论】:

    • 我刚刚让我的应用程序抛出了这个异常。我没有设置图钉的宽度或高度,尽管图钉确实有按钮作为子控件,并设置了 BorderThickness="0" Padding="0"。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多