在Xamarin中使用CorePlot的饼图显示一个白色的空白屏幕

时间:2014-09-16 09:40:04

标签: ios xamarin.ios xamarin core-plot pie-chart

我从Xamarin Component Store中获得了该组件,并成功设法制作了一个直线和条形图,但是在饼图上有一点困难。

饼图代码:

protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);
        var view = NativeView;
        var graph = new CPTXYGraph
        {
            Title = "Pie Chart",
            TitleTextStyle = new CPTMutableTextStyle
            {
                FontSize = 50,
                Color = CPTColor.GreenColor,
            },
        };

        var plotSpace = (CPTXYPlotSpace)graph.DefaultPlotSpace;
        plotSpace.AllowsUserInteraction = true;     

        graph.ApplyTheme(CPTTheme.ThemeNamed((NSString)"Plain Black"));
        graph.PlotAreaFrame.BorderLineStyle.LineColor = CPTColor.BlackColor;

        var plot = new CPTPieChart
        {
            DataSource = new PiePlotDataSource()
        };                   

        graph.AddPlot(plot);

        view.AddSubview(new CPTGraphHostingView
        {
            HostedGraph = graph
        });       
    }

数据源代码:

class PiePlotDataSource : CPTPieChartDataSource
{
    public override int NumberOfRecordsForPlot(CPTPlot plot)
    {
        return DummyData.Data.Length;
    }

    public override NSNumber NumberForPlot(CPTPlot plot, CPTPlotField forFieldEnum, uint index)
    {
        return forFieldEnum == CPTPlotField.PieChartWidth ? DummyData.Data[index] : index;
    }
}

我得到的只是一个白色的空白屏幕,标题错位,无法缩放或滚动(我为大图片道歉,我不知道如何调整大小):

Screenshot

线条图和条形图以类似的方式受到影响,它们工作正常。我已经把断点放入并检查它是否在代码的任何地方停止但执行似乎也正常。

但它没有做的事情是PiePlotDataSource方法没有被调用。我已经证实他们在线条和条形图中被调用了,但由于某些原因,他们没有在这里被调用。

由于文档太少,我花了几天时间才得到一些适用于Android和iOS的通用图表。这是我需要做的最后一张图表,所以我非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我已经设法让它工作,我90%确定可能是潜在的问题。我原本以为设置主机视图,图形和绘图的顺序可能是问题,但结果却并非如此。

修订后的代码是:

protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
    base.OnElementChanged(e);
    var view = NativeView;

    var graph = new CPTXYGraph
    {
        Title = "Pie Chart",

    };

    var hostView = new CPTGraphHostingView(view.Bounds);
    view.AddSubview(hostView);

    var plot = new CPTPieChart
    {
        DataSource = new PiePlotDataSource(),
        PieRadius = hostView.Bounds.Size.Height / 4,
    };

    graph.AddPlot(plot);   

    hostView.HostedGraph = graph;            
}

我更改的是,在创建CPTGraphHostingView()时,我将父亲的View.Bounds作为参数传递,然后将结果分配给变量hostView,稍后将使用该变量。我相信这是造成布局问题的原因。

然后在设置饼图的hostView属性时使用PieRadius。如果未设置此属性,则不会显示饼图(仅显示一组X和Y轴)。

就未调用的PiePlotDataSource方法而言,简单的清理和重建修复了该问题。其NumberForPlot()方法的更新代码位于:

public override NSNumber NumberForPlot(CPTPlot plot, CPTPlotField forFieldEnum, uint index)
{
    return forFieldEnum == CPTPlotField.BarLocation ? DummyData.Data[index] : index;
}

请注意,我正在将forFieldEnumCPTPlotField.BarLocation进行比较,而不是CPTPlotField.PieChartWidth。这是因为我提出了一些断点并逐步完成了该方法,结果发现forFieldEnum总是CPTPlotField.BarLocation。我相信这是Xamarin CorePlot Compoenent的某种绑定错误。

答案 1 :(得分:0)

不确定您的xamarin组件中的coreplot版本。我正在使用1.5.1.2版本

但我发现我无法使用您的方法来运行public override NSNumber NumberForPlot(CPTPlot plot, CPTPlotField forFieldEnum, uint index)

解决方案:

public override NSNumber NumberForPlot(CPTPlot plot, CPTPlotField forFieldEnum, nuint index)
            {
                int i = Convert.ToInt32(index);
                return forFieldEnum == CPTPlotField.BarLocation ? data[i].X : data[i].Y;
            }