У меня есть приложение Silverlight, которое создаст холст, сохранит холст как WriteableBitmap и отправит WriteableBitmap в качестве MemoryStream на серверную сторону, чтобы вставить изображение внутри сообщения электронной почты ,Silverlight Embedded ImageBrush не рендеринг при сохранении как WriteableBitmap
Все работает нормально, пока я не получу новое требование, чтобы я показывал определенные изображения (кисть изображения с URL-адресом, указывающим на некоторые файлы изображений, чтобы избежать путаницы, назовем его GreenIconBrush) внутри холста. Теперь холст отлично отображался на стороне Silverlight, однако в письме все появилось, за исключением GreenIconBrush.
Холст состоит из элемента ItemsControl, который использует DataTemplate. В зависимости от данных, я буду загружать различные ImageBrush, которые определяются следующим образом:
Ресурс:
<ImageBursh x:key="GreenIconBrush" ImageSource="Images/TrafficLightGreen.png"/>
Xaml:
<Grid>
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Border Background="Binding ScoreByIconColor, Converter={StaticResource ScoreColorToBrushColorConverter}">
</Border>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
Преобразователь:
<Converts:ValueMapperConverter x:Key="ScoreColorToBrushConverter">
<Converts:ValueMapperConverter.Map>
<Converts:MappedItem key="green" Value="{StaticResource GreenIconBrush}" />
</Converts:ValueMapperConverter.Map>
</Converts:ValueMapperConverter>
Вот код, который отображает изображение на холсте и создает WriteableBitmap и вызывает веб-службу для отправки e почта
ScoreCard target = new ScoreCard();
setupScoreCard(target, data);
target.UpdateLayout();
canvas.Children.Add(target);
canvas.UpdateLayout();
WriteableBitmap bitmap = new WriteableBitmap(canvas, null);
// bitmap.Invalidate(); <- tried this, does not help
MemoryStream stream = (MemoryStream)SaveToStream(bitmap);
stream.Seek(0, SeekOrigin.Begin);
data.ScoreCard = ReadToEnd(stream);
wcfService.SendEmailAsync(data);
На стороне веб-службы:
MailMessage msg = new MailMessage();
// setup to, from, SmtpClient, etc.
msg.IsBodyHtml = true;
AlternateView view = AlternateView.CreateAlternateViewFromString(emailTemplate.ToString(), null, MediaTypeNames.Text.Html);
MemoryStream fs = new MemoryStream();
fs.Write(data.ScoreCard, 0, data.ScoreCard.Length);
fs.Seek(0, SeekOrigin.Begin);
LinkedResource pic = new LinkedResource(fs, new System.Net.Mine.ContentType("image/png");
view.LinkedResources.Add(pic);
msg.AlternateViews.Add(view);
smtp.Send(msg);
Я подозреваю, что проблема связана с ImageBrush не было вынесено, когда я сохраняю холст на WriteableBitmap, но я попытался InvalidateMeasure(), InvalidateArrange() как на мишене, так и на холсте, и я даже попытался применить преобразование и сделать Invalidate WriteableBitmap, но ничего не получилось.
Пожалуйста, помогите ...
С уважением,
Чарли Чан