2015-08-24 5 views
0

У меня есть приложение 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, но ничего не получилось.

Пожалуйста, помогите ...

С уважением,

Чарли Чан

ответ

0

Ну, проблема в том, что встроенный файл PNG не получает наносится на холст и стать частью WriteableBitmap, когда я отправьте его на серверную сторону для отправки по электронной почте.

Потеряв много часов, пытаясь сделать эту работу, я решил просто воссоздать изображения в Xaml (конвертировать изображение в Xaml - вектор не был хорошей идеей, так как вы теряете слишком много качества), и теперь все работает отлично.

Charlie

 Смежные вопросы

  • Нет связанных вопросов^_^