2012-10-06 2 views
1

나는 그 순간 생각을 가지고 노는 중이며 벽돌 벽에 부딪혔다. 내가 VisualBrush를 사용하여 이미지에 그 컨트롤을 저장하려고하는데, 시각적 컨트롤 (DevExpress 차트 컨트롤을 정밀하게)을 만들기 위해 콘솔 앱을 사용하고 있습니다. 그러나 컨트롤 (가정)이 작동하지 않습니다. 화면에 그려지지 않습니다.렌더링되지 않은 컨트롤을 사용하는 비주얼 브러시?

내가 아래에 코드를 입력 했으므로 현재 내가 어디에 있는지 알 수 있습니다. 아무도 내가 어쩌면이 컨트롤을 이미지 (이상적으로 jpg로 저장할 수 있지만, 아무 것도 할 것이다 ...) 콘솔 앱을 사용하여 어떻게 알 수 있습니까? 난 정말 ... 그냥 저장 할 수도 밀리 초에 화면에 렌더링하고 싶지 않습니다

static void sl_CreateDetail(FrameworkElement chartControl1, CreateAreaEventArgs e) 
{ 
     var brush = new VisualBrush(chartControl1); 
     var visual = new DrawingVisual(); 
     DrawingContext context = visual.RenderOpen(); 

     context.DrawRectangle(brush, null, 
      new Rect(0, 0, chartControl1.ActualWidth, chartControl1.ActualHeight)); 
     context.Close(); 

     var bmp = new RenderTargetBitmap((int)chartControl1.ActualWidth, 
      (int)chartControl1.ActualHeight, 96, 96, PixelFormats.Pbgra32); 

     bmp.Render(visual); 
     e.Data = bmp; 
} 

답변

0

컨트롤을 렌더링하기 전에 수동 Measure를 호출하여 레이아웃을 수행해야 및 Arrange. 이를 위해서는 컨트롤의 원하는 크기를 지정해야합니다. 명시 적으로 Width 및 Height 속성을 설정합니다.

VisualBrush 및 DrawingVisual은 필요하지 않으며 컨트롤을 RenderTargetBitmap에 직접 렌더링 할 수 있습니다.

chartControl1.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
chartControl1.Arrange(new Rect(0, 0, chartControl1.Width, chartControl1.Height)); 
chartControl1.UpdateLayout(); 

var bmp = new RenderTargetBitmap((int)chartControl1.ActualWidth, 
    (int)chartControl1.ActualHeight, 96, 96, PixelFormats.Pbgra32); 

bmp.Render(chartControl1); 

컨트롤 (측정)에 배치 동안 적절한 사이즈를 계산하는 경우에, 당신은 아마 렌더링의 DesiredSize 속성을 사용할 수 있습니다.

chartControl1.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
chartControl1.Arrange(new Rect(new Point(), chartControl1.DesiredSize)); 
chartControl1.UpdateLayout(); 

참고 또한 렌더링 스레드의 ApartmentStateSTA해야한다는. 콘솔 응용 프로그램에서는 STAThread 특성을 Main 메서드에 간단하게 적용 할 수 있습니다.

[STAThread] 
static void Main(string[] args) 
{ 
    ... 
} 
+0

나는 Measure/Arrange를했는데 효과가 없었습니다. STA 스레드는 이미 제자리에 있습니다. 작은 데모를 위해 뭔가를 얻으려면 신속하게 접근 방식을 변경해야했습니다. 내 접근 방식을 다시 전환하고 최대한 빨리 전체 제안을 시도해 보겠습니다. – Faraday

0

내가 측정()() 배열을 시도, 등, 그 시각은 부모가있는 경우 이러한 작업 않는 것을 발견! 내 경우에는 하나의 컨테이너에서 Visual을 제거하고 속성 (색상 등)을 업데이트 한 다음 VisualBrush로 사용하려고 시도했지만 업데이트되지 않았습니다. Measure() 및 Arrange() 기간 동안 원본 컨테이너에 그대로두면 고정되었지만 (모든 것이 화면에서 끝났음에도 불구하고)