1

現在、アイデアをいじっていて、レンガの壁にぶち当たりました。コンソール アプリを使用してメモリ内にビジュアル コントロール (正確には DevExpress chartcontrol) を作成しています。次に、VisualBrush を使用してそのコントロールを画像に保存しようとしていますが、(私が想定する) コントロールが原因で機能しません。画面に描画されません。

私が今どこにいるかわかるように、コードを以下に示します。コンソールアプリを使用して、このコントロールを画像(理想的にはjpgですが、何でもできます...)に保存する方法を知っている人はいますか? 保存できるようにするためだけに、1ミリ秒でも画面にレンダリングする必要はありません...

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;
}
4

2 に答える 2

0

コントロールをレンダリングする前に、MeasureArrangeを呼び出して手動でレイアウトを行う必要があります。これには、コントロールの目的のサイズを指定する必要があります。たとえば、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();

レンダリング スレッドのApartmentStateが である必要があることにも注意してくださいSTAコンソール アプリケーションでは、 STAThread属性を Main メソッドに適用するだけです。

[STAThread]
static void Main(string[] args)
{
    ...
}
于 2012-10-07T07:37:24.087 に答える
0

Measure()、Arrange() などを試してみたところ、Visual に親がある場合にこれらの DO が機能することがわかりました。私の場合、1 つのコンテナから Visual を削除し、そのプロパティ (色など) を更新してから、それを VisualBrush として使用しようとしましたが、更新されませんでした。Measure() と Arrange() の間、元のコンテナーに残しておくと、修正されました (すべてオフスクリーンで行われたにもかかわらず)。

于 2013-06-24T13:16:22.063 に答える