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

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

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

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

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

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

введите здесь описание изображения


person Ignacio Soler Garcia    schedule 18.04.2012    source источник


Ответы (1)


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

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

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

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

person Chris Grant    schedule 18.04.2012
comment
Удивительно, я не читал этого, так как не был на Silverlight. Спасибо! - person Ignacio Soler Garcia; 18.04.2012
comment
В любом случае это не решает мою проблему с данными привязки. Поскольку я привязываюсь, похоже, что привязки не обрабатываются до тех пор, пока элемент управления не будет загружен правильно? - person Ignacio Soler Garcia; 18.04.2012
comment
Я думаю, вам нужно сначала убедиться, что проблема именно в этом. Что бы я сделал, так это сохранил вашу работу, а затем постепенно все упрощал и упрощал. Удалите привязки и замените их добавлением некоторых вещей на диаграмму в коде. Если это работает, то мы знаем, что это проблема связывания. - person Chris Grant; 19.04.2012
comment
Привет, я точно знаю, что это проблема с привязкой, но я решил проблему, используя скрытое окно. Позже я попробую использовать элемент управления без привязок. Спасибо, в любом случае! - person Ignacio Soler Garcia; 19.04.2012