【问题标题】:Bing maps Pushpins from XML Feed必应映射来自 XML 源的图钉
【发布时间】:2010-12-06 12:14:17
【问题描述】:

我一直在使用本教程尝试在地图上显示图钉: http://compiledexperience.com/windows-phone-7/tutorials/quake

下面的各位,我已经快到了,但是

如果我用原始位替换我的位(注释掉的部分) 然后执行“开始调试”,我得到一个未处理的异常。如果我继续调试,我会在一瞬间看到地图和图钉,然后退出。 我放回原来的注释代码和它的罚款...... 如果您需要更多信息,请告诉我。我对此感到非常沮丧:(再次感谢。

调用栈:

QuakeML.dll!QuakeML.App.OnUnhandledException(object sender = {QuakeML.App}, System.Windows.ApplicationUnhandledExceptionEventArgs e = {System.Windows.ApplicationUnhandledExceptionEventArgs}) 第 37 行 + 0x5 字节 C# System.Windows.dll!MS.Internal.Error.CallApplicationUEHandler(System.Exception e = {"UIElement.Arrange(finalRect) 不能在 finalRect 中使用 Infinite 或 NaN 值调用。"}) + 0x30 字节
System.Windows.dll!MS.Internal.Error.CallAUEHandler(uint hr = 2148474880, out uint bIsHandled = 0) + 0x6 bytes
[本机到托管转换]

当前代码:

namespace QuakeML
{
    public partial class MainPage
    {
        public MainPage()
        {
            InitializeComponent();

            Loaded += OnLoaded;
        }

        private void OnLoaded(object sender, RoutedEventArgs e)
        {
            LoadQuakes();
        }

        private void LoadQuakes()
        {
            var webClient = new WebClient();

            webClient.OpenReadCompleted += OnOpenReadCompleted;


            var uri = "http://www.tfl.gov.uk/tfl/businessandpartners/syndication/feed.aspx?email=mycomputer@clara.co.uk&feedId=3";
          //  var uri = "http://magma.geonet.org.nz/services/quake/quakeml/1.0.1/query?startDate=2010-09-03&endDate=2010-09-05&magnitudeLower={0:0.0}&magnitudeUpper=8";

            webClient.OpenReadAsync(new Uri(uri, UriKind.Absolute));
        }



        private void OnOpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            var document = XDocument.Load(e.Result);

             if(document.Root == null)
                return;

             var xmlns = XNamespace.Get("http://www.tfl.gov.uk/tfl/syndication/namespaces/geo");
             //var xmlns = XNamespace.Get("http://quakeml.org/xmlns/quakeml/1.0");

                var events = from ev in document.Descendants("item")
                         select new
                         {
                             Latitude = Convert.ToDouble(ev.Element(xmlns + "Point").Element(xmlns + "lat").Value),
                             Longitude = Convert.ToDouble(ev.Element(xmlns + "Point").Element(xmlns + "long").Value),
                         };


              //var events = from ev in document.Descendants(xmlns + "event")
                //           select new
               //            {
                //              Latitude = Convert.ToDouble(ev.Element(xmlns + "origin").Element(xmlns + "latitude").Element(xmlns + "value").Value),
               //               Longitude = Convert.ToDouble(ev.Element(xmlns + "origin").Element(xmlns + "longitude").Element(xmlns + "value").Value),

               //           };

            QuakeLayer.Children.Clear();


                foreach(var ev in events)
            {
                var accentBrush = (Brush)Application.Current.Resources["PhoneAccentBrush"];

                var pin = new Pushpin
                {
                    Location = new GeoCoordinate
                    {
                        Latitude = ev.Latitude,
                        Longitude = ev.Longitude
                    },
                    Background = accentBrush,

                };

                QuakeLayer.AddChild(pin, pin.Location);
            }
        }

        private void OnRefresh(object sender, RoutedEventArgs e)
        {
            LoadQuakes();
        }

    }
}

主页上的地图项:

【问题讨论】:

  • 以上代码中哪几行是第37行?
  • PS:app.xaml.cs 中的第 37 行:Debugger.Break();在:私有静态无效OnUnhandledException(对象发件人,ApplicationUnhandledExceptionEventArgs e){if(Debugger.IsAttached)Debugger.Break(); }

标签: c# xml silverlight windows-phone-7


【解决方案1】:

您需要命名空间引用,因为它在您正在解析的 XML 中具有别名。

这行得通:

var xmlns = XNamespace.Get("http://www.tfl.gov.uk/tfl/syndication/namespaces/geo");

var events = from ev in document.Root.Descendants("item")
                select new
                        {
                            Latitude = Convert.ToDouble(ev.Element(xmlns + "Point").Element(xmlns + "lat").Value),
                            Longitude = Convert.ToDouble(ev.Element(xmlns + "Point").Element(xmlns + "long").Value),
                        };

【讨论】:

    【解决方案2】:

    如果您指定了获得异常的行会有所帮助,但我猜这是您使用 XNames 的方式的问题。

    在您使用“geo:Point”、“geo:lat”和“geo:long”的地方,您应该首先创建这些变量:-

    XName geoPoint = XName.Get("Point", "http://www.tfl.gov.uk/tfl/syndication/namespaces/geo");
    XName geoLat = XName.Get("lat", "http://www.tfl.gov.uk/tfl/syndication/namespaces/geo");
    XName geoLong = XName.Get("long", "http://www.tfl.gov.uk/tfl/syndication/namespaces/geo");
    

    那么你的代码可能看起来像:-

    var events = from ev in document.Root.Descendants("item")   
                 select new   
                 {   
                    Latitude = (double)ev.Element(geoPoint).Element(geoLat),   
                    Longitude = (double)ev.Element(geoPoint).Element(geoLong)   
                 };
    

    【讨论】:

    • 感谢您的回复,我正在努力让您的解决方案正常工作。我在运行时遇到的错误(似乎它试图加载提要,因为它已经加载了地图) XmLException 未处理 ':' 字符,十六进制值 0x3A,不能包含在名称中。这是第 57 行
    • @Dan:这是我希望你在使用那些“geo:xxxx”字符串时得到的例外。我不清楚您的意思是说您仍然可以通过我的修改获得它?
    • 针对当前情况更改了原始帖子。谢谢。丹
    • 我想知道是不是图钉太多了,只有 182 个。今晚我将尝试在 silverlight 桌面应用程序中重新创建应用程序,看看是否可行。
    • @Dan:你真的,真的需要找出你的代码中的哪一行实际上是在抛出错误。在 OnOpenReadCompleted 的顶部放置一个断点并单步执行。确保您已应用我给您的更改,如果仍然失败,请调整您的问题以包含您所做的更改。调试是关于具体和有条理的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多