2012-10-06 26 views
1

我現在正在玩弄一個想法,並且碰到了一堵磚牆。我正在使用一個控制檯應用程序在內存中創建一個可視化控件(DevExpress chartcontrol),然後我試圖使用VisualBrush將該控件保存到圖像,但它不起作用,因爲(我認爲)控件沒有畫到屏幕上。使用未呈現的控件的可視化畫筆?

我把我的代碼放在下面,所以你知道我現在在哪裏。有誰知道我可以如何使用控制檯應用程序將此控件保存到圖像(最好是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。這要求你指定所需的控件大小,例如通過明確設置其寬度和高度屬性。

不需要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(); 

還要注意的是渲染線程的ApartmentState必須STA。在控制檯應用程序中,您可以簡單地將STAThread屬性應用於Main方法。

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

我做了測量/安排,它沒有工作。我已經有STA線程的東西。我不得不快速改變我的方法,以便爲小型演示工作。我會盡快改變我的做法,儘快嘗試您的全面建議(在接下來的幾天內)。 – Faraday

0

我試過Measure(),Arrange()等,然後發現如果Visual有一個父項,這些工作將會發揮作用!在我的情況下,我從一個容器中刪除了Visual,更新了它的屬性(顏色等),然後嘗試將它用作VisualBrush並且沒有更新。在Measure()和Arrange()修復期間將其留在原始容器中(即使它已全部在屏幕外完成)。