In het Handboek Silverlight 3 staat op pagina’s 155-157 de code voor een Writeable Bitmap en een Bitmap van een gedeelte van de userinterface. Deze code werkt niet goed, omdat de WriteableBitmap Class bij het aanmaken een parameter minder heeft gekregen in de definitieve versie van Silverlight 3. De PixelFormats parameter is vervallen en de bestandsindeling is nu altijd Pbgra32. Daarom moet de Writeable Bitmap iets anders geïmplementeerd worden. Bovendien zijn de Lock() en Unlock() methodes vervallen, maar het is nog steeds nodig om Invalidate() aan te roepen.
Bij aanmaken van een WriteableBitmap moet in plaats van…
[sourcecode language=”XML”]
private void WriteBitmap()
{
const int imageWidth = 200;
const int imageHeight = 200;
WriteableBitmap wbm = new WriteableBitmap(
imageWidth, imageHeight, PixelFormats.Bgr32);
wbm.Lock();
for (int x = 0; x < imageWidth; x++)
{
for (int y = 0; y < imageHeight; y++)
{
// genereer een kleur in Pbgra32 format
byte[] components = new byte[4];
components[0] = (byte)(x % 255); // blauw
components[1] = (byte)(y % 255); // groen
components[2] = (byte)(x * y % 255); // rood
components[3] = 0; // alpha transparantie
int pixelValue = BitConverter.ToInt32(components, 0);
// zet de waarde van de pixels
wbm[y * imageWidth + x] = pixelValue;
}
}
wbm.Invalidate();
wbm.Unlock();
TheBitmap.Source = wbm;
}
[/sourcecode]
…er dit staan:
[sourcecode language=”XML”]
private void WriteBitmap()
{
const int imageWidth = 200;
const int imageHeight = 200;
WriteableBitmap wbm = new WriteableBitmap(imageWidth, imageHeight);
for (int x = 0; x < imageWidth; x++)
{
for (int y = 0; y < imageHeight; y++)
{
// genereer een kleur in Pbgra32 format
byte[] components = new byte[4];
components[0] = (byte)(x % 255); // blauw
components[1] = (byte)(y % 255); // groen
components[2] = (byte)(x * y % 255); // rood
components[3] = 255; // alpha transparantie
int pixelValue = BitConverter.ToInt32(components, 0);
// zet de waarde van de pixels
wbm.Pixels[y * imageWidth + x] = pixelValue;
}
}
// zet de source van de afbeelding en teken opnieuw.
wbm.Invalidate();
TheBitmap.Source = wbm;
}
[/sourcecode]
Bij het vastleggen van een deel van de userinterface in een WriteableBitmap moet in plaats van…
[sourcecode language=”XML”]
<Grid x:Name="TheGrid">
…
</Grid>
wbmUI = new WriteableBitmap((int) TheGrid.RenderSize.Width, (int) TheGrid.RenderSize.Height, PixelFormats.Bgr32);
wbmUI.Render(TheGrid, new TranslateTransform());
imgResult.Content = new Image() { Source = wbmUI };
[/sourcecode]
…er dit staan:
[sourcecode language=”XML”]
WriteableBitmap wbmUI = new WriteableBitmap((int) TheGrid.RenderSize.Width,(int) TheGrid.RenderSize.Height);
wbmUI.Render(TheGrid, null);
imgResult.Content = new Image() { Source = wbmUI };
[/sourcecode]
Njoy Writeable Bitmaps!