BingMaps Silverlight 在Out Of Browser中的使用

BingMaps Silverlight 在Out Of Browser中的使用,第1张

概述今天在做WP7手机的GPS模拟器,准备使用BingMaps Silverlight(BMSL),但是发现BMSL在以Out Of Browse(OOB)方式运行的时候不显示任何的东西,并没有报错,所以的Zoom、Scale功能都能使用,因此我猜测是TileSource的问题,使用自定义的TileSource(没有写任何的额外代码,就是override GetUri方法,并且GetUri方法的实现也

今天在做WP7手机的GPS模拟器,准备使用BingMaps Silverlight(BMSL),但是发现BMSL在以Out Of browse(OOB)方式运行的时候不显示任何的东西,并没有报错,所以的Zoom、Scale功能都能使用,因此我猜测是TileSource的问题,使用自定义的TileSource(没有写任何的额外代码,就是overrIDe GetUri方法,并且GetUri方法的实现也是调用父类的方法)调试发现,GetUri方法返回null,这就是为什么BMSL在OOB方式运行中不显示东西的原因。既然它没有正确的算出Uri,我写一个TileSource帮它算不就行了吗?

编写自己的Mode和TileSource

    public class OOBChineseRoadModeTileSource : LocationRectTileSource
    {
        public overrIDe Uri GetUri(int x,int y,int zoomLevel)
        {
            //调用LocationRectTileSource的GetUri返回的是null,估计这个就是OOB下显示不出地图的原因,因此自己计算Uri返回
            string quadkey = new QuadKey(x,y,zoomLevel).Key;
            Uri uri = new Uri("http://r3.tiles.ditu.live.com/tiles/r" + quadkey + ".png?g=47");//使用中国Bing地图
            return uri;
        }
    }

    public class OObroadMode : RoadMode
    {
        public OObroadMode()
            : base()
        {
            var tileLayer = (MapTileLayer)this.Content;
            var tileSources = tileLayer.TileSources;
            tileSources.Clear();
            tileSources.Add(new OOBChineseRoadModeTileSource());
        }
    }

然后在初始化地图的时候是用我们的OObroadMode

map.Mode = new OObroadMode();

就可以了。

我这里使用的是BingMaps的中文TileServer,如果使用英文TileServer的话可以使用下面的TileSource

    public class OObroadModeTileSource : LocationRectTileSource
    {
        public overrIDe Uri GetUri(int x,zoomLevel).Key;
            Uri uri = new Uri("http://ecn.t1.tiles.virtualearth.net/tiles/r1.png?g=346&token="+quadkey);
            return uri;
        }
    }

这样能显示出来了,但是在地图中间总是有一个白条,这个白条不是TileServer返回的,应该是BMSLd出的一个提示消息,还没找到办法去掉。找到了会再写blog。

更新:找到去掉白条的方法了,我响应地图的MouseRightbuttonDown事件,写代码:

var items = CommonHelper.FindDesendants<LoadingErrorMessage>(LayoutRoot);

调试发现items中有一个{Microsoft.Maps.MapControl.Overlays.LoadingErrorMessage},没错的话就是它了,试了一下,发现把它隐藏就可以了,因此我使用定时器定时找界面上的LoadingErrorMessage并且隐藏就可以:

            dispatcherTimer timerHIDeErrorMsg = new dispatcherTimer();
            timerHIDeErrorMsg.Interval = TimeSpan.FromSeconds(1);
            timerHIDeErrorMsg.Tick += new EventHandler(timerHIDeErrorMsg_Tick);
            timerHIDeErrorMsg.Start();

        voID timerHIDeErrorMsg_Tick(object sender,EventArgs e)
        {
            var items = CommonHelper.FindDesendants<LoadingErrorMessage>(LayoutRoot);
            foreach (var item in items)
            {
                item.Visibility = windows.Visibility.Collapsed;
            }
        }

FindDesendants是我写的一个静态方法:

        public static IEnumerable<T> FindDesendants<T>(this DependencyObject baSEObj) where T : DependencyObject        {            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(baSEObj); i++)            {                var child = VisualTreeHelper.GetChild(baSEObj,i);                if (child is T)                {                    yIEld return (T)child;                }                foreach (var c in FindDesendants<T>(child))                {                    yIEld return (T)c;                }            }        }

总结

以上是内存溢出为你收集整理的BingMaps Silverlight 在Out Of Browser中的使用全部内容,希望文章能够帮你解决BingMaps Silverlight 在Out Of Browser中的使用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1074764.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存