2015-09-09 2 views
0

Я хочу отобразить элемент управления XAML в PNG-файле с помощью функции RenderTargetBitmap. До сих пор это здорово.RenderTargetBitmap не отображает включенные изображения

Но если XAML содержит любые изображения, эти изображения не отображаются в PNG-файле. Это моя XAML:

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Name="LayoutRoot" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    d:DesignHeight="336" 
    d:DesignWidth="336" 
    Background="DarkGray"> 

<TextBlock Text="This is my Text" 
      FontSize="35" 
      HorizontalAlignment="Center" /> 
<Image Source="http://www.myurl.com/image.png" 
     Height="200" /></Grid> 

И это мой код:

private BitmapSource RenderToBitmap(FrameworkElement target) 
    { 
     Rect bounds = VisualTreeHelper.GetDescendantBounds(target); 
     RenderTargetBitmap renderBitmap = new RenderTargetBitmap((int)target.ActualWidth, 
      (int)target.ActualHeight, 
      96, 96, PixelFormats.Pbgra32); 

     DrawingVisual visual = new DrawingVisual(); 
     using (DrawingContext context = visual.RenderOpen()) 
     { 
      VisualBrush brush = new VisualBrush(target); 
      context.DrawRectangle(brush, null, new Rect(new Point(), bounds.Size)); 
     } 
     renderBitmap.Render(visual); 
     return renderBitmap; 
    } 

также попытался с ссылочных изображениями, как "/Assets/image.png" и как ресурс. Каждый раз, когда изображение отсутствует в визуализированном файле PNG.

+0

есть вы проверить ваш URL-адрес изображения? 'http: // www.myurl.com/image.png' пуст для меня. –

+0

Это просто фиктивный URL для этих вопросов. Он также не работает с правильным URL-адресом изображения. –

+0

попробуйте вызвать 'target.ApplyTemplate()' в начале – thumbmunkeys

ответ

2

Во-первых, что вы делаете свою цель, но ваш ImageControl загружает BitmapSource асинхронно и пока не готов. Если вы подождете, когда ImageControl завершит загрузку своего источника, вы получите то, что ожидаете. Приятно отметить, что ImageControl не сообщает вам о завершении загрузки.

Итак, короткий ответ будет: Если вы хотите, чтобы сделать существующее и уже загружен визуальными изображения, просто подождать, пока не будут загружены вложенные элементы управление изображения.

Как это:

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     img.LayoutUpdated += img_LayoutUpdated; 
    } 

    void img_LayoutUpdated(object sender, EventArgs e) 
    { 
     img.LayoutUpdated -= img_LayoutUpdated; 
     var rt = RenderToBitmap(img); 
     Save(rt); 
    } 

Насколько я знаю, нет простого способа заставить ImageControl загрузить его источник. И когда ImageControl выбрасывает событие «Loaded», это не означает, что изображение загружено. Если бы вы ImageControl.Source создан как BitmapImage, вы могли бы сделать что-то вроде этого:

  BitmapImage bi = new BitmapImage(); 
      bi.BeginInit(); 
      bi.DecodePixelHeight = 100; 
      bi.CacheOption = BitmapCacheOption.OnLoad; 
      bi.UriSource = new Uri(@"http://www.myurl.com/image.png"); 
      bi.EndInit(); 
      bi.DownloadCompleted += bi_DownloadCompleted; //will be ready to be saved to image when event will fire 
      img.Source = bi; 

или загрузить изображение самостоятельно, как этот

WebClient wc = new WebClient(); 
    using (MemoryStream stream = new MemoryStream(wc.DownloadData(@"http://www.google.ru/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"))) 
    { 
     BitmapImage myBitmapImage = new BitmapImage(); 
     myBitmapImage.BeginInit(); 
     myBitmapImage.StreamSource = stream; 
     myBitmapImage.DecodePixelWidth = 200; 
     myBitmapImage.EndInit(); 
     img.Source = myBitmapImage; 
     // ready to be saved to image 
    } 

Но на мой взгляд это не подойдет вам хорошо

Если цель состоит в том, чтобы сделать визуальный в памяти, то вы должны взглянуть на этот вопрос: Drawing a WPF UserControl with DataBinding to an Image