BingMaps Silverlight 在Out Of Browser中的使用
2011-02-19 19:02
423 查看
今天在做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;
}
}
}
编写自己的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;
}
}
}
相关文章推荐
- BingMaps Silverlight 在Out Of Browser中的使用
- Silverlight 3 Out of Browser Feature
- Silverlight实例教程 - Out of Browser配置,安装和卸载(转)
- 稳扎稳打Silverlight(41) - 3.0Tip/Trick之GPU 加速, Out-Of-Browser, 应用程序库缓存, 合并 ResourceDictionary, 应用程序扩展服务, Silverlight 插件对象
- [Tips] [Silverlight] Silverlight OOB (Out-of-browser )Debug兩三事-設定起始專案
- Silverlight实例教程 - Out of Browser配置,安装和卸载
- Silverlight实例教程 - Out of Browser与Office的互操作
- Silverlight实例教程 - Out of Browser的Debug和Notifications窗口
- 学习使用Bing Maps Silverlight Control(三):向地图添加标记
- 扎稳打Silverlight(44) - 4.0浏览器外运行(Out Of Browser)之OOB的增强及其新增的NotificationWindow
- Silverlight实例教程 - Out of Browser与COM的交互基础
- Silverlight实例教程 - Out of Browser与Office的互操作
- Silverlight全屏与Out-of-Browser支持
- 学习使用Bing Maps Silverlight Control(二):基本控制
- Silverlight实例教程 - Out of Browser配置,安装和卸载
- 【Silverlight】Bing Maps学习系列(八):使用Bing Maps Silverlight Control加载自己部署的Google Maps
- Silverlight实例教程 - Out of Browser与COM的交互基础
- Silverlight实例教程 - Out of Browser配置,安装和卸载 推荐
- 学习使用Bing Maps Silverlight Control(四):添加自定义瓦片图层
- Silverlight实例教程 - Out of Browser与COM的交互基础