Кръгова диаграма, използваща CorePlot в Xamarin, показва бял празен екран

Взех компонента от 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;
    }
}

Всичко, което получавам, е само бял празен екран с неправилно поставено заглавие, което не може да бъде увеличено или превъртено (извинявам се за голямото изображение, не съм сигурен как да го преоразмеря):

Екранна снимка

Линейните и лентовите диаграми бяха изпълнени по подобен начин и работят добре. Поставих точки на прекъсване и проверих дали спира някъде в кода, но изпълнението също изглеждаше добре.

Нещото, което обаче не прави е, че методите PiePlotDataSource не се извикват. Проверих, че се извикват в линейните и стълбовидни диаграми, но по някаква причина не се извикват тук.

Отне ми няколко дни, за да накарам няколко общи графики да работят за Android и iOS поради толкова малко документация. Това е последната диаграма, която трябва да направя, така че ще съм много благодарен за всяка помощ.


person Kevin Lee    schedule 16.09.2014    source източник


Отговори (2)


Успях да го накарам да работи и съм 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;
}

Забележете, че сравнявам forFieldEnum с CPTPlotField.BarLocation вместо CPTPlotField.PieChartWidth. Това беше, защото поставих някои точки на прекъсване и преминах през метода, само за да открия, че forFieldEnum винаги е CPTPlotField.BarLocation. Вярвам, че това е някаква обвързваща грешка към компонента Xamarin CorePlot.

person Kevin Lee    schedule 18.09.2014

Не съм сигурен с вашата версия на coreplot в компонента xamarin. Използвам версия 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;
            }
person Kevin Loke    schedule 19.02.2016