2011-05-03 2 views
10

WPF 컨트롤을 비트 맵 이미지로 렌더링하는 것은 오늘 알게된 것처럼 간단한 작업이 아닙니다. 지금 부모 컨트롤 마진을 다루는 알고있는 릭 Strahl는 자신의 블로그에 쓴 문제가"보이지 않는"WPF 컨트롤을 비트 맵 이미지로 렌더링

http://www.west-wind.com/weblog/posts/2007/Sep/10/Rendering-a-WPF-Container-to-Bitmap

지금까지 내가 창문하지만 내부 볼 수있는 컨트롤의 비트 맵을 만들 수 있어요입니다 I 실제로해야 할 일은 보이지 않는 컨트롤의 비트 맵을 만드는 것입니다. 코드에서 사각형과 타원 같은 모양을 만들고 비트 맵으로 디스크에 저장하려고합니다. 나를 위해 이것은 개인적인 악몽으로 밝혀진다. 내 ActualHeight 및 ActualWidth는 항상 0이므로 대신 Height와 Width를 사용합니다. 그러나 내가 얻는 것은 통제 할 수있는 크기의 빈 이미지입니다.

보이는 창에 추가하지 않고 컨트롤의 비트 맵을 만들려면 어떻게해야합니까?

답변

19

새 요소의 레이아웃이 수행되지 않았습니다. 컨트롤을 렌더링하기 전에 컨트롤에서 [측정 및 정렬]을 호출해야합니다.

Canvas c = new Canvas(); 

Rectangle r = new Rectangle 
{ 
    Fill = Brushes.Orange, 
    Width = 200, 
    Height = 100 
}; 

Ellipse e = new Ellipse 
{ 
    Fill = Brushes.DodgerBlue, 
    Width = 100, 
    Height = 100 
}; 

Canvas.SetLeft(e, 150); 

c.Children.Add(r); 
c.Children.Add(e); 

var size = new Size(250,100); 
c.Measure(size); 
c.Arrange(new Rect(size)); 

RenderTargetBitmap bmp = new RenderTargetBitmap(250, 100, 96, 96, PixelFormats.Pbgra32); 

bmp.Render(c); 

PngBitmapEncoder enc = new PngBitmapEncoder(); 
enc.Frames.Add(BitmapFrame.Create(bmp)); 

using(var s = File.OpenWrite("image.png")) 
    enc.Save(s); 
관련 문제