我相信大多数使用Bing Maps开发的朋友都见过如下的画面,就是当我们在开发Bing Maps的时候,将开发KEY填写错误导致用户授权验证失败出现的下图提示错误。  
使用Bing Maps Silverlight Control开发的缺点就在于它默认是使用的微软自己提供的在线地图数据,而且Bing Maps Silverlight Control还与开发者账号进行绑定才能正常使用,如果开发KEY填写错误或是不填写开发KEY就会出现上图的提示。实际上这个验证失败的提示信息是可以被屏蔽的,我们同样是可以使用Bing Maps Silverlight Control来做我们的离线(不使用微软的地图数据,不通过用户开发KEY验证)开发的。
通过仔细分析可知道,我们无论是做有限还是离线,本质上没有多大的区别,不同就是所加载的地图数据不同而已,要解决加载不同的地图数据完全可以通过自定义TileSource实现。另外还要解决一个问题,就是在没有通过开发KEY验证的情况下如何把错误提示图层给干掉,也就是删除或屏蔽错误提示图层。
实际开发中我们却无法直接将错误提示层给屏蔽掉,只有通过其他间接的方式来处理。仔细查阅API可以发现,Bing Maps Silverlight Control的Map控件具有一个LoadError的事件,我们可以在此事件中动一些手脚,来把可恶的错误提示层给干掉。通过Reflector反编译可以发现LoadError事件的处理代码:
private void Map_LoadingError(object sender, LoadingErrorEventArgs e)
{
    if (this.loadingErrorMessage == null)
    {
        this.loadingErrorMessage = new LoadingErrorMessage();
        base.RootLayer.get_Children().Add(this.loadingErrorMessage);
    }
    if (e.get_LoadingException() is UriSchemeNotSupportedException)
    {
        this.loadingErrorMessage.SetUriSchemeError(base.Culture);
    }
    else if (e.get_LoadingException() is ConfigurationNotLoadedException)
    {
        this.loadingErrorMessage.SetConfigurationError(base.Culture);
    }
    else if (e.get_LoadingException() is CredentialsInvalidException)
    {
        this.loadingErrorMessage.SetCredentialsError(base.Culture);
    }
}
通过反编译和调试跟踪可以发现Map控件的根布局容器名为RootLayer,其下的有多个子节点元素,其他一个就是错误提示层节点元素,要实现屏蔽错误提示信息之需要通过代码实现将该子元素从Map控件的子元素节点中移出即可。这里我们可以故意不填写开发KEY并同时添加LoadError事件处理来进行测试,可得到如下图所示的结果。
可以发现当发生了错误引发LoadError后,就会触发上面反编译出来的事件委托方法,跟踪RootLayer的子节点可以发现Map控件下共有6个子节点,且LoadErrorMessage是最后添加到Map子节点元素中的,也就是说LoadErrorMessage节点在Map控件的Children中的索引为5,找到了具体的子节点元素现在只需要将其他隐藏或直接移除就解决了问题。
最简单的方式就是自己扩展一个Map控件,在其构造方法中将错误提示层给干掉,然后再项目中使用自定义的Map控件,大致可以如下实现。
public class OfflineMap:Map
{
    public OfflineMap()
        : base()
    {
        base.LoadingError += (sender, e) =>
            {
                base.RootLayer.Children.RemoveAt(5);
            };
    }
}
<!--使用自定义的Map控件->

<controls:OfflineMap></controls:OfflineMap>

最大的问题已经解决,接下来就可以根据自己的需求做离线的开发了。比如使用自己的地图数据,详细请查阅《Bing Maps进阶系列九:使用MapCruncher进行地图切片并集成进Bing Maps》中介绍的方法实现。或者通过自定义TileSource加载自己部署的Google本地部署的地图数据,详细请查阅《【Silverlight】Bing Maps学习系列(八):使用Bing Maps Silverlight Control加载自己部署的Google Maps》。

本文转自 beniao 51CTO博客,原文链接:http://blog.51cto.com/beniao/322851,如需转载请自行联系原作者

【Silverlight】Bing Maps开发应用与技巧三:Bing Maps Silverlight Control的离线开发相关推荐

  1. 【Silverlight】Bing Maps开发应用与技巧二:自定义图钉标注控件和动态ToolPanel

    在Bing Maps Silverlight Control中以及为我们提供了地图图钉控件Pushpin,我曾经在< 使用图钉层(Pushpin layer)及地图图层(MapLayer)> ...

  2. WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形

    原文:WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形 说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘> ...

  3. bing每日壁纸_如何将Bing的每日背景用作Ubuntu壁纸

    bing每日壁纸 You're a Linux user, so naturally you're not Microsoft's biggest fan. But even you have to ...

  4. Silverlight 2.5D RPG游戏技巧与特效处理(Game Effects):目录

    以当下主流的2.5D RPG客户端品质游戏特效为借鉴,以最大程度控制性能损失为前提,将Silverlight游戏资源占用最小化,综合效果及用户体验最优化,即本系列作者想要向大家讲解的核心技术知识. 本 ...

  5. Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统

    Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统 作者: 深蓝色右手  来源: 博客园  发布时间: 2011-04-19 11:18  阅读: 1282 次  推荐: 0 ...

  6. Linux Shell常用技巧(三) sed

    Linux Shell常用技巧(三) sed 八.流编辑器sed 8.1 sed简介 sed是stream editor的缩写,一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区 ...

  7. 79. Leetcode 871. 最低加油次数 (堆-技巧三-事后小诸葛)

    技巧三 - 事后小诸葛这个技巧指的是:当从左到右遍历的时候,我们是不知道右边是什么的,需要等到你到了右边之后才知道.如果想知道右边是什么,一种简单的方式是遍历两次,第一次遍历将数据记录下来,当第二次遍 ...

  8. 百万数据查询优化技巧三十则,新增5条

    百万数据查询优化技巧三十则 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判 ...

  9. 工作效率提升技巧三:做事的心态

    上升高度的东西,很多人都不喜欢.比如道理.原理.思考.态度,等等. 有时候,最没用的东西是这些上升高度的东西.有时候,最有用的东西也是这些上升高度的东西. 今天,我们就从上升高度中的"心态& ...

最新文章

  1. 基础练习 杨辉三角形
  2. python classmothed_python函数之classmethod()
  3. python声明编码作用_Python源代码中的编码声明字符串的作用
  4. 安卓入门系列-04常见布局之LinearLayout(线性布局)
  5. NOIP模拟测试9「随·单·题」
  6. Vue页面骨架屏(一)
  7. 4.与JSP的第一次握手
  8. 深圳行:1207-Day 1 - 到达
  9. 【收藏】10个重要问题概览Transformer全部内容
  10. 手撸一个 Router 框架(上):熟悉 APT
  11. android 多次点击事件,Android按钮onclick事件在多次单击后激发
  12. js 图表处理之Echar
  13. Adobe MAX 2011第一天主题演讲实录
  14. python sklearn逻辑回归 sgd和lr_LR逻辑回归模型的原理、公式推导、Python实现和应用...
  15. AntV使用方法详解
  16. 微指令和指令(机器指令)有什么区别?
  17. Spark组件之GraphX学习9--使用pregel函数求单源最短路径
  18. 只做了delete操作,为啥 ORACLE-01466表定义已更改
  19. R语言caret机器学习(一)数据可视化:绘制特征变量图
  20. Torque 4.0 下载、安装、配置、提交作业、列队id归零

热门文章

  1. 【RAC】使用一条“ps”命令获取Linux环境下全部RAC集群进程信息
  2. cisco 交换机配置trunk被拒绝
  3. Window平台下的Android的环境配置
  4. Silverlight实例教程 – Datagrid,Dataform数据验证和ValidationSummary
  5. 推荐一个XNA的学习站点
  6. 《c++ templates》学习笔记(9)——第十二章 特化与重载
  7. js怎么获取一个元素与屏幕右边的距离_js获取元素到屏幕左上角的距离
  8. com.tadu.android中文,塔读文学(com.tadu.android) - 6.68 - 应用 - 酷安
  9. Xamarin.FormsShell基础教程(4)Shell项目内容列表页面运行效果
  10. 网络数据包信息收集工具ferret-sidejack