保存为WriteableBitmap时,Silverlight嵌入式ImageBrush无法呈现

时间:2015-08-24 17:52:40

标签: silverlight silverlight-5.0

我有一个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无效工作

请帮忙......

此致

张查理

1 个答案:

答案 0 :(得分:0)

好吧,问题是嵌入式PNG文件在画布上没有渲染,当我将它发送到服务器端以便在电子邮件中发送时,它就成为了writeablebitmap的一部分。

在浪费了很多时间试图完成这项工作之后,我决定只是重新创建Xaml中的图像(将图像转换为Xaml - 矢量不是一个好主意,因为你失去了太多的质量)并且现在一切正常。

查理