BingMaps Silverlight 在Out Of Browser中的使用

今天在做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, int y, int zoomLevel)
        {
            //调用LocationRectTileSource的GetUri返回的是null,估计这个就是OOB下显示不出地图的原因,因此自己计算Uri返回
            string quadkey = new QuadKey(x, y, zoomLevel).Key;
            Uri uri = new Uri("http://ecn.t1.tiles.virtualearth.net/tiles/r1.png?g=346&token="+quadkey);
            return uri;
        }
    }

这样能显示出来了,但是在地图中间总是有一个白条,这个白条不是TileServer返回的,应该是BMSL弹出的一个提示消息,还没找到办法去掉。找到了会再写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;
                }
            }
        }

如鹏网.Net培训班正在报名,有网络的地方就可以参加如鹏网的学习,学完就能高薪就业,点击此处了解

 

    三年前只要懂“三层架构”就可以说“精通分层架构”;现在则需要懂IOC(AutoFac等)、CodeFirst、lambda、DTO等才值钱;

    三年前只要会SQLServer就可以说自己“精通数据库开发”;现在则需还需要掌握MySQL等开源数据库才能说是“.Net开源”时代的程序员;

    三年前只要会进行用户上传内容的安全性处理即可;现在则需要熟悉云存储、CDN等才能在云计算时代游刃有余;

    三年前只要掌握Lucene.Net就会说自己“熟悉站内搜索引擎开发”;现在大家都用ElasticSearch了,你还用Lucene.Net就太老土了;

    三年前发邮件还是用SmtpClient;现在做大型网站发邮件必须用云邮件引擎;

    三年前缓存就是Context.Cache;现在则是Redis、Memcached的天下;

    如鹏网再次引领.Net社区技术潮流!点击此处了解如鹏网.Net最新课程

转载于:https://www.cnblogs.com/rupeng/archive/2011/02/19/1958631.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值