Круговая диаграмма с использованием CorePlot в Xamarin показывает белый пустой экран

Я получил компонент из магазина компонентов 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, из-за очень небольшого количества документации. Это последняя диаграмма, которую мне нужно сделать, поэтому я буду очень признателен за любую помощь.


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 Compoenent.

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