-->

使用控制视觉刷未呈现?(Visual brush using control which isn&#

2019-08-01 05:20发布

我玩弄此刻的想法,我已经打了一个砖墙。 我使用一个控制台应用程序来创建一个可视化控件(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;
}

Answer 1:

呈现控件之前,你必须通过调用手动完成其布局措施和安排 。 这需要你指定控件的所需的大小,例如,通过显式地设置其宽度和高度属性。

没有必要为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)
{
    ...
}


Answer 2:

我试图测量(),安排(),等等,然后发现,这些做的工作,如果视觉有父! 以我为例,我从一个容器中取出的视觉,更新它的属性(颜色等),然后尝试使用它作为一个VisualBrush,它是不会得到更新。 把它留在原来的容器措施的期限()和安排()固定它(即使它全部完成屏幕外)。



文章来源: Visual brush using control which isn't rendered?