我玩弄此刻的想法,我已经打了一个砖墙。 我使用一个控制台应用程序来创建一个可视化控件(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;
}
呈现控件之前,你必须通过调用手动完成其布局措施和安排 。 这需要你指定控件的所需的大小,例如,通过显式地设置其宽度和高度属性。
没有必要为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属性的主要方法。
[STAThread]
static void Main(string[] args)
{
...
}
我试图测量(),安排(),等等,然后发现,这些做的工作,如果视觉有父! 以我为例,我从一个容器中取出的视觉,更新它的属性(颜色等),然后尝试使用它作为一个VisualBrush,它是不会得到更新。 把它留在原来的容器措施的期限()和安排()固定它(即使它全部完成屏幕外)。