2009-07-07 9 views
1

Je suis en train de monter sur un projet Silverlight 2 qui exploite le contrôle Bing Maps. Une chose que nos gars UX se demandent est s'il est possible de personnaliser complètement l'apparence de la carte. Par exemple, dessinez des pays comme des contours simples avec des intérieurs de couleurs différentes. Ou dessinez l'océan en blanc et les pays en forme de pointillés noirs.Rendu personnalisé dans Bing Silverlight Control

Est-ce que quelqu'un sait s'il est possible d'atteindre ce niveau de personnalisation? La classe MapMode semblait prometteuse, mais elle ne semble pas me donner tout ce dont j'ai besoin.

Merci, Kent

Répondre

1

Pour répondre à ma propre question, oui cela est possible.

Tout d'abord, ajouter votre propre couche avec une source de carrelage personnalisé:

<m:Map> 
    <m:Map.Mode> 
     <mCore:MercatorMode/> 
    </m:Map.Mode> 
    <m:Map.Children> 
     <m:MapTileLayer> 
      <m:MapTileLayer.TileSources> 
       <local:CustomTileSource/> 
      </m:MapTileLayer.TileSources> 
     </m:MapTileLayer> 
    </m:Map.Children> 
</m:Map> 

Ensuite, définir le CustomTileSource. Voici un exemple:

public class CustomTileSource : TileSource 
{ 
    public CustomTileSource() 
     : base(GetAbsoluteUrl("/ClientBin/Resources/{0}.png")) 
    { 
    } 

    public override Uri GetUri(int x, int y, int zoomLevel) 
    { 
     var quadKey = new QuadKey(x, y, zoomLevel); 
     return new Uri(String.Format(this.UriFormat, quadKey.Key)); 
    } 

    public static string GetAbsoluteUrl(string strRelativePath) 
    { 
     if (string.IsNullOrEmpty(strRelativePath)) 
      return strRelativePath; 

     string strFullUrl; 
     if (strRelativePath.StartsWith("http:", StringComparison.OrdinalIgnoreCase) 
      || strRelativePath.StartsWith("https:", StringComparison.OrdinalIgnoreCase) 
      || strRelativePath.StartsWith("file:", StringComparison.OrdinalIgnoreCase) 
     ) 
     { 
      //already absolute 
      strFullUrl = strRelativePath; 
     } 
     else 
     { 
      //relative, need to convert to absolute 
      strFullUrl = System.Windows.Application.Current.Host.Source.AbsoluteUri; 
      if (strFullUrl.IndexOf("/ClientBin") > 0) 
       strFullUrl = strFullUrl.Substring(0, strFullUrl.IndexOf("/ClientBin")) + strRelativePath; 
     } 

     return strFullUrl; 
    } 
} 

Notez que la source de tuile doit renvoyer une URL. Si vous avez une image que vous souhaitez utiliser comme carte, vous pouvez utiliser l'outil MapCruncher pour le préparer.

Questions connexes