RenderTargetBitmap отображает пустой элемент управления, если он не установлен в окне (диаграмма Visiblox)

Я пытаюсь визуализировать диаграмму Visiblox для изображения, чтобы иметь возможность показывать сотни из них одновременно. Диаграмма генерируется в коде и отображается без ее отображения.

Проблема, с которой я сталкиваюсь, заключается в том, что после визуализации диаграмма выглядит пустой. Верхний элемент управления - это график, нижний - график, отображаемый перед добавлением его в элемент управления. Некоторый рендеринг делается, поскольку там есть водяной знак.

Диаграмма заполняется с использованием привязок и текста данных (на всякий случай, если это имеет значение). Глядя на график перед рендерингом, он выглядит так, будто он фактически пустой, спасибо, я спрашиваю: "Когда привязки извлекаются с помощью UserControl?".

И вот код, который я использую для визуализации изображения:

    public BitmapSource Render(FrameworkElement control)
    {
        if (control == null)
        {
            throw new ArgumentNullException("control");
        }

        control.UpdateLayout();

        Viewbox viewBox = new Viewbox();
        viewBox.Child = control; // Control to render
        viewBox.Measure(new System.Windows.Size(control.Width, control.Height));
        viewBox.Arrange(new Rect(0, 0, control.Width, control.Height));
        viewBox.ApplyTemplate();
        viewBox.UpdateLayout();

        RenderTargetBitmap renderer = new RenderTargetBitmap((int)(control.Width * _dpiX / 96.0), (int)(control.Height * _dpiY / 96.0), _dpiX, _dpiY, PixelFormats.Pbgra32);

        DrawingVisual drawingVisual = new DrawingVisual();
        using (DrawingContext drawingContext = drawingVisual.RenderOpen())
        {
            VisualBrush visualBrush = new VisualBrush(viewBox);
            drawingContext.DrawRectangle(visualBrush, null, new Rect(new Point(), new System.Windows.Size(control.Width, control.Height)));
        }

        renderer.Render(drawingVisual);

        // Remove the container to be able to reuse the control again if we appended it to a viewbox
        viewBox.Child = null;

        return renderer;
    }

1 ответ

Решение

Если вы заинтересованы в сохранении диаграммы Visiblox в изображение, в блоге Visiblox приведен пример кода. Вы можете найти статью здесь - http://www.visiblox.com/blog/2011/09/saving-a-chart-as-an-image

В статье рассказывается о том, как экспортировать изображение в Silverlight, но в загрузке содержится пример кода, который показывает, как это сделать и в WPF.

Я использовал эту технику в своих приложениях ранее, и я всегда обнаруживал, что использование этого примера кода - лучшее место для начала!

Дайте мне знать, если это не сработает для вас - у меня достаточно опыта в этом! Я бы хотел убедиться, что вы вызвали Invalidate() на диаграмме в нужное время, и убедитесь, что его макет обновлен, прежде чем пытаться экспортировать его.

Другие вопросы по тегам