【发布时间】:2015-08-28 22:40:07
【问题描述】:
我有一个 Silverlight 应用程序,它会创建一个画布,将画布保存为 WriteableBitmap,并将 WriteableBitmap 作为 MemoryStream 发送到服务器端,以便将图像嵌入到电子邮件中。
一切正常,直到我得到一个新要求,即我必须在画布内显示某些图像(带有指向某些图像文件的 URL 的图像刷,以避免混淆,我们称之为 GreenIconBrush)。现在,画布在 Silverlight 端渲染得很好,但是,在电子邮件中,除了 GreenIconBrush 之外的所有东西都显示出来了。
画布由使用 DataTemplate 的 ItemsControl 组成。根据数据,我将加载不同的 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 并调用 Web 服务发送电子邮件的代码
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);
我怀疑问题与我将画布保存到 WriteableBitmap 时未渲染 ImageBrush 有关,但我在目标和画布上尝试了 InvalidateMeasure()、InvalidateArrange(),我什至尝试应用转换并使 WriteableBitmap 无效但没有工作。
请帮忙...
此致,
张查理
【问题讨论】:
标签: silverlight silverlight-5.0