【问题标题】:Silverlight Embedded ImageBrush not rendering when saved as WriteableBitmapSilverlight Embedded ImageBrush 在另存为 WriteableBitmap 时不呈现
【发布时间】: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


    【解决方案1】:

    嗯,问题是当我将嵌入的 PNG 文件发送到服务器端以通过电子邮件发送时,它不会在画布上呈现并成为 writeablebitmap 的一部分。

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

    查理

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多