2010-02-24 7 views
2

J'utilise la commande Silverlight WriteableBitmap pour afficher un 'camembert' en utilisant le code suivant.Bitmap inscriptible Silverlight

Chart GetChart() 
    { 
     Chart newChart = new Chart() { Width = 100.0, 
             Height = 100.0 }; 

     PieSeries pieSeries = new PieSeries(); 
     pieSeries.SetBinding(PieSeries.ItemsSourceProperty, new Binding()); 
     pieSeries.DependentValueBinding = new Binding("Value"); 
     pieSeries.IndependentValueBinding = new Binding("Key"); 
     pieSeries.AnimationSequence = AnimationSequence.FirstToLast; 
     pieSeries.IsSelectionEnabled = true; 
     newChart.Series.Add(pieSeries); 

     newChart.SetValue(Chart.DataContextProperty, new KeyValuePair<string, int>[] 
          { 
           new KeyValuePair<string, int>("Work", 9), 
           new KeyValuePair<string, int>("Driving", 2), 
           new KeyValuePair<string, int>("Family", 4), 
           new KeyValuePair<string, int>("Sleep", 8), 
           new KeyValuePair<string, int>("Friends", 1) 
          }); 
     return newChart; 
    } 

    WriteableBitmap bmapPreviewCanvas = new WriteableBitmap(GetChart, null); 

Le résultat auquel je m'attendais est un bitmap avec un PieChart. Ce que j'ai obtenu était un bitmap avec l'arrière-plan sans aucun PieChart. Question est: Que dois-je faire pour obtenir le camembert rendu dans la variable 'bmapPreviewCanvas'?

Editer: Cela a-t-il quelque chose à voir avec ANIMATIONSEQUENCE?

Répondre

5

Je crois que votre problème est que l'instance du contrôle Chart que vous essayez de créer un bitmap n'est pas dans l'arborescence visuelle.

Je ne l'ai pas réellement essayé moi-même, mais je crois que vous devez utiliser explicitement le Render() method de la classe WritableBitmap si l'UIElement ne fait pas partie de l'arbre visuel. Vous devrez également appeler InvalidateMeasure() sur l'élément avant d'appeler Render() et Invalidate() sur WritableBitmap pour rendre le bitmap.

De la documentation MSDN:

Après avoir appelé cette méthode, vous devez appeler invalidate afin de rendre le bitmap.

Cette méthode prend en charge les objets UIElement qui ne font pas partie de l'arborescence visuelle. Vous devez appeler Mesurer et organiser pour les objets UIElement qui ne sont pas dans l'arborescence visuelle, avant d'appeler Render.

Je effectuez les opérations suivantes à la place:

var chart = GetChart(); 
chart.InvalidateMeasure(); 
WriteableBitmap bmapPreviewCanvas = new WriteableBitmap(chart.Width, chart.Height); 
bmpaPreviewCanvas.Render(chart, null); 
bmapPreviewCanvas.Invalidate(); 
+0

Dan, vous avez raison à nouveau. Je vois le bitmap étant généré si je l'ajoute à un canevas ou à l'arbre visuel. Je vous remercie. Je prends cette question un peu plus loin. J'utilise l'Image rendue dans un ImageBrush et essaye de remplir le rectangle avec ça. Une idée pour laquelle le rectangle n'affichera pas l'image? – kanchirk

+0

Je n'ai aucune idée sans voir plus de code, mais j'ai trouvé un message sur un bug possible WritableBitmap/ImageBrush: http://forums.silverlight.net/forums/p/110869/261935.aspx –

+0

Dan, Merci pour le Lien. J'ai également rencontré le même lien à peu près au même moment que vous avez posté. On dirait que c'est un problème connu dans SL3. Merci pour l'aide. – kanchirk