2010-08-01 4 views
2

Я пытаюсь создать растровое изображение с границы WPF. Все это сидит в приложении asp.net (конечно, на стороне сервера), работающем с .net 4.0.Создание растрового изображения WPF UIElement в ASP.NET

Проблема в том, что сгенерированное изображение, ну, пусто. У кого-нибудь есть идея, почему?

Вот код.

public static byte[] Draw(int width, int height) 
    { 
     MemoryStream memoryStream 
      = new MemoryStream(); 
     Thread t = new Thread(delegate() 
      { 
       System.Windows.Controls.Border border = new System.Windows.Controls.Border() 
       { 
        Background = Brushes.Red, 
        BorderBrush = Brushes.Green, 
        CornerRadius = new System.Windows.CornerRadius(5), 
        Width = width, 
        Height = height 
       }; 

       border.ApplyTemplate(); 

       RenderTargetBitmap renderTargetBitmap = 
        new RenderTargetBitmap(width, height, 90, 90, PixelFormats.Pbgra32); 

       renderTargetBitmap.Render(border); 

       BitmapEncoder bitmapEncoder = 
        new PngBitmapEncoder(); 

       bitmapEncoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap)); 
       bitmapEncoder.Save(memoryStream); 
      }); 
     t.SetApartmentState(ApartmentState.STA); 
     t.Start(); 
     bool success = t.Join(5000); 

     if (success) 
      return memoryStream.ToArray(); 
     else 
      throw new Exception("Fail"); 
    } 

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

ответ

4

Добавить сразу после border.ApplyTemplate:

border.Measure(new Size(width, height)); 
border.Arrange(new Rect(0, 0, width, height)); 
border.UpdateLayout(); 

Ваша граница не обновлять себя, прежде чем вы сохраните его.

+0

хороший, спасибо товарищу! –