2011-08-30 120 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