Записываемое изображение Silverlight - PullRequest
2 голосов
/ 25 февраля 2010

Я использую команду Silverlight WriteableBitmap для рендеринга «круговой диаграммы» с использованием следующего кода.

    Chart GetChart()
    {
        Chart newChart = new Chart() { Width = 100.0, 
                                       Height = 100.0  };

        PieSeries pieSeries = new PieSeries();
        pieSeries.SetBinding(PieSeries.ItemsSourceProperty, new Binding());
        pieSeries.DependentValueBinding = new Binding("Value");
        pieSeries.IndependentValueBinding = new Binding("Key");
        pieSeries.AnimationSequence = AnimationSequence.FirstToLast;
        pieSeries.IsSelectionEnabled = true;
        newChart.Series.Add(pieSeries);

        newChart.SetValue(Chart.DataContextProperty, new KeyValuePair<string, int>[] 
                            {
                                new KeyValuePair<string, int>("Work", 9), 
                                new KeyValuePair<string, int>("Driving", 2), 
                                new KeyValuePair<string, int>("Family", 4), 
                                new KeyValuePair<string, int>("Sleep", 8), 
                                new KeyValuePair<string, int>("Friends", 1) 
                            });
        return newChart;
    }

    WriteableBitmap bmapPreviewCanvas = new WriteableBitmap(GetChart, null);

Результат, который я ожидал, это растровое изображение с круговой диаграммой. Я получил растровое изображение с фоном без круговой диаграммы.

Вопрос: что мне нужно сделать, чтобы круговая диаграмма отображалась в переменной 'bmapPreviewCanvas'?

Редактировать: Это имеет какое-либо отношение к ANIMATIONSEQUENCE?

1 Ответ

5 голосов
/ 25 февраля 2010

Я считаю, что ваша проблема в том, что экземпляр элемента управления Chart, который вы пытаетесь создать, не находится в визуальном дереве.

Я на самом деле не пробовал это сам, но я считаю, что вы должны явно использовать метод Render () класса WritableBitmap, если UIElement не является частью визуального дерева. Вам также придется вызывать InvalidateMeasure () для элемента перед вызовом Render () и Invalidate () для WritableBitmap впоследствии, чтобы фактически отобразить растровое изображение.

Из документации MSDN:

После вызова этого метода необходимо вызвать Invalidate, чтобы отобразить растровое изображение.

Этот метод поддерживает объекты UIElement, которые не являются частью визуального дерева. Перед вызовом Render необходимо вызвать Measure and Arrange для объектов UIElement, которых нет в дереве визуалов.

Я бы попробовал следующее:

var chart = GetChart();
chart.InvalidateMeasure();
WriteableBitmap bmapPreviewCanvas = new WriteableBitmap(chart.Width, chart.Height);
bmpaPreviewCanvas.Render(chart, null);
bmapPreviewCanvas.Invalidate();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...