2016-10-18 1 views
0

Je développe une application pour UWP. Mon but était d'optimiser le rendu des points de la carte sur la carte bing. J'ai commencé à partir de la mise en cluster des marqueurs personnalisés avec l'opération map.children.add(). Après le groupe de grappes de grappes, j'ajoute pin avec l'objet de dépendance généré dans xaml. Chaque changement de position sur la carte rafraîchit toutes les broches actuellement affichées. Son fonctionnement très lent. J'ai donc essayé d'utiliser MapElement.Add(). Son fonctionne bien, mais je ne peux pas ajouter une image générique (XAML) code (carte _native est MapControl):Personnaliser MapIcon dans MapControl UWP

var mapIcon = new MapIcon(); 
    mapIcon.Image = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Images/icon.png")); 
    mapIcon.Location = new Geopoint(snPosition); 
    mapIcon.Title = "Some label".ToString(); 
    _nativemap.MapElements.Add(mapIcon); 

Est-il possible de personnaliser l'étiquette de mapIcon (position, couleur, etc.) ou générer flux de fichier XAML pour le montrer comme image mapIcon réelle ??

+0

Il n'y a pas de problème avec votre code, que voulez-vous? Pour ajouter le mapicon dans le code xaml et ne le générez pas dans le code derrière? –

+0

Pour ajouter un mapicon avec l'image en tant que flux (généré par xaml) sur la carte – user3045261

Répondre

0

Pour ajouter mapicon avec l'image en tant que flux (généré par XAML) sur la carte

Je ne sais pas comment vous générer un flux d'images par XAML, je suppose que vous avez un contrôle ou quelque chose et vous utilisez RenderTargetBitmap pour générer une source d'image qui est remplie avec le contenu combiné d'un arbre visuel XAML. Ensuite, vous pouvez utiliser BitmapEncoder pour créer un InMemoryRandomAccessStream.

Pour démontrer comment utiliser BitmapEncoder, je prends le scénario 1 de MapControl sample officiel par exemple ici:

Créer une SymbolIcon pour le MapIcon et créer un Button pour mettre MapIcon sur la carte:

<Grid x:Name="imgContainer" Margin="0,5" Width="20" Height="25"> 
    <SymbolIcon Symbol="AddFriend" Foreground="Red" /> 
</Grid> 
<Button Content="Place MapIcon" Click="Button_Click" /> 

Code derrière:

private async void Button_Click(object sender, RoutedEventArgs e) 
{ 
    //render symbolicon to bmp 
    RenderTargetBitmap renderbmp = new RenderTargetBitmap(); 
    await renderbmp.RenderAsync(imgContainer); 

    using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream()) 
    { 
     //create a bitmap encoder 
     BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream); 
     //write pixels into this encoder 
     var pixels = await renderbmp.GetPixelsAsync(); 
     var reader = DataReader.FromBuffer(pixels); 
     byte[] bytes = new byte[reader.UnconsumedBufferLength]; 
     reader.ReadBytes(bytes); 
     encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, 
      (uint)renderbmp.PixelWidth, (uint)renderbmp.PixelHeight, 0, 0, bytes); 
     await encoder.FlushAsync(); 
     mapIconStreamReference = RandomAccessStreamReference.CreateFromStream(stream); 

     //create mapIcon 
     var mapIcon = new MapIcon(); 
     mapIcon.Image = mapIconStreamReference; 
     mapIcon.Location = new Geopoint(myMap.Center.Position); 
     mapIcon.Title = "Some label".ToString(); 
     myMap.MapElements.Add(mapIcon); 
    } 
} 

Rendu de l'image de est démo: enter image description here