Silverlight可写位图

kan*_*irk 2 silverlight

我正在使用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);
Run Code Online (Sandbox Code Playgroud)

我期待的结果是带有PieChart的Bitmap.我得到的是一个没有任何PieChart背景的Bitmap.

问题是:我应该怎么做才能在变量'bmapPreviewCanvas'中呈现饼图?

编辑:这是否与ANIMATIONSEQUENCE有关?

Dan*_*air 5

我相信您的问题是您尝试创建位图的Chart控件的实例不在可视树上.

我自己并没有真正尝试过,但我相信如果UIElement不是可视树的一部分,你必须显式使用WritableBitmap类的Render()方法.在调用Render()之前,您还必须在元素上调用InvalidateMeasure(),然后在WritableBitmap上调用Invalidate()以实际渲染位图.

从MSDN文档:

调用此方法后,必须调用Invalidate才能呈现位图.

此方法支持不属于可视树的UIElement对象.在调用Render之前,您需要为不在可视树中的UIElement对象调用Measure和Arrange.

我会尝试以下代码:

var chart = GetChart();
chart.InvalidateMeasure();
WriteableBitmap bmapPreviewCanvas = new WriteableBitmap(chart.Width, chart.Height);
bmpaPreviewCanvas.Render(chart, null);
bmapPreviewCanvas.Invalidate();
Run Code Online (Sandbox Code Playgroud)