【问题标题】:Pie Chart using CorePlot in Xamarin shows a white blank screen在 Xamarin 中使用 CorePlot 的饼图显示白色空白屏幕
【发布时间】:2014-09-16 09:40:04
【问题描述】:

我从 Xamarin 组件商店中获得了该组件,并成功地制作了折线图和条形图,但在制作饼图时遇到了一点困难。

饼图代码:

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

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

折线图和条形图以类似的方式实现,它们工作正常。我已经设置了断点并检查它是否在代码的任何地方停止,但执行似乎也工作正常。

它没有做的事情是 PiePlotDataSource 方法没有被调用。我已经验证了它们在折线图和条形图中被调用,但由于某种原因,它们没有在此处被调用。

由于文档太少,我花了几天时间才得到一些适用于 Android 和 iOS 的通用图表。这是我需要做的最后一张图表,如果有任何帮助,我将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    我已经设法让它工作,我 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,后面会用到。我相信这是导致布局问题的原因。

    然后在设置饼图的PieRadius 属性时使用hostView。如果未设置此属性,则不会显示饼图(仅显示一组 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 组件的某种绑定错误。

    【讨论】:

      【解决方案2】:

      不确定 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;
                  }
      

      【讨论】:

        猜你喜欢
        • 2017-04-19
        • 2018-09-18
        • 1970-01-01
        • 2022-08-10
        • 2014-01-13
        • 2022-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多