2011-08-30 82 views
0

我正在创建一个带有内置WebBrowser控件的.Net库。图书馆通常应该在其他应用程序中处理谷歌地图。基本上所有重要的谷歌地图API事件都发送到我的C#库传递到应用程序使用它。正在下载文件块javascript事件?

一切都很好,直到使用我的lib的应用程序想要在点击时更改标记图标并双击执行不同的操作。在这种情况下,应用程序将在C#中的水平,这反过来又调用一个JavaScript函数来改变地图上的图标标记图标:

function SetMarkerIcon(id, imageUri) { 
    markers[id].setIcon(imageUri); 
} 

我调试的问题是JavaScript的冻结,直到图像文件被下载和结论对第二次点击无响应,这应该会触发'dblclick'事件。所以我的第一个问题是这是否是正确的思维方式。

基于这个假设我试着使用的setTimeout有点延迟一个文件的下载:

function SetMarkerIcon(id, imageUri) { 
    setTimeout(function() { markers[id].setIcon(imageUri); }, 200); 
} 

但显然这种解决方案很“脏”(虽然在测试环境中工作,其实它的工作对甚至在使用本地.js文件时延迟0ms,可能是因为setTimeout使用了一种单独的线程,但与服务器上的脚本无关),因此第二个问题:您是否有任何可用的想法来正确解决此错误?

如果问题有点模糊,请提前致谢。

回答

1

您可以使用精灵非常快地切换标记图标。您将所有图标作为精灵存储在常规网格位置的一个文件中。您只将该文件加载到浏览器中。通过更改精灵的原点来切换图标。这是一个原型实现:

var pos = new google.maps.LatLng(0, 0); 
var url = "/.../sprites.png";    // file with all icons as sprites 
var size = new google.maps.Size(24, 24); // size of 1 sprite 
var origin = new google.maps.Point(0, 0); 
var anchorPos = new google.maps.Point(12, 12); 
var icon = new google.maps.MarkerImage(url, size, origin, anchorPos); 
var marker = new google.maps.Marker({  
    position: new google.maps.LatLng(0, 0),  
    map: map,  
    icon: icon 
}); 

marker.getIcon().origin = new google.maps.Point(5 * 24, 0); // set the icon to the 5'th sprite 
+0

感谢您的这个想法!实现这将是有问题的(因为标记图标是在一些非托管代码中动态生成的),但可能是可能的。我将在稍后保留此解决方案。 – slawekwin