我有一个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无效工作
请帮忙......
此致
张查理答案 0 :(得分:0)
好吧,问题是嵌入式PNG文件在画布上没有渲染,当我将它发送到服务器端以便在电子邮件中发送时,它就成为了writeablebitmap的一部分。
在浪费了很多时间试图完成这项工作之后,我决定只是重新创建Xaml中的图像(将图像转换为Xaml - 矢量不是一个好主意,因为你失去了太多的质量)并且现在一切正常。
查理