Xamarin - SFChart - 从 PrimaryAxis

问题描述

我正在处理的项目有一个日期过滤器和一个图表,可以通过一个按钮将 PrimaryAxis(the x) 更改为天、月或年,如下所示: enter image description here

但是,当我看到 DAY 数据(例如移动到列或缩放)并想单击 MONTH 按钮时,PrimaryAxis 中的 IntervalType 几个月不会改变,它会停留在几天内。但有趣的是:当我按下图表中的一列时,它会正确更新数月。

这是一个视频,展示了发生的事情: https://drive.google.com/file/d/1KQTE3JBDUG-cin17bchrXN7OlwDrXI5C/view?usp=sharing

xml:

<Frame Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="3" HasShadow="False" HeightRequest="250" Padding="10" CornerRadius="20">
                <StackLayout Orientation="Vertical" Spacing="0" VerticalOptions="FillAndExpand
                    <chart:SfChart
                        BindingContext="{Binding viewmodel}"
                        VerticalOptions="FillAndExpand"
                        BackgroundColor="White"
                        Grid.Row="2"
                        IsEnabled="{Binding IsBusy,Converter={StaticResource InverseBoolConverter}}">
                        <chart:SfChart.Title>
                            <chart:ChartTitle Text="{local:Translate EnergyChartTitle}" FontFamily="{StaticResource OpenSans-SemiBold}"
                                FontSize="16" TextColor="{StaticResource LightBlue}" Margin="3,3,23"/>
                        </chart:SfChart.Title>
                        <chart:SfChart.ChartBehaviors>
                            <chart:ChartZoomPanBehavior EnableDoubleTap="False" EnableZooming="False"/>
                            <chart:ChartTooltipBehavior Duration="5"/>
                        </chart:SfChart.ChartBehaviors>
                        <chart:SfChart.PrimaryAxis>
                            <chart:DateTimeAxis ShowMajorGridLines="False" ShowMinorGridLines="False" IntervalType="{Binding EnergyIntervalUnit}" Interval="1" AutoScrollingDelta="12"
                                                AutoScrollingDeltaType="{Binding EnergyScrollingMode}" EnableAutoIntervalOnZooming="True" AutoScrollingMode="Start">
                                <chart:DateTimeAxis.Title>
                                    <chart:ChartAxisTitle Text="{local:Translate DateLabel}" FontSize="15" Margin="2"/>
                                </chart:DateTimeAxis.Title>
                            </chart:DateTimeAxis>
                        </chart:SfChart.PrimaryAxis>
                        <chart:SfChart.SecondaryAxis>
                            <chart:NumericalAxis MinorTicksPerInterval="1" ShowMinorGridLines="False">
                                <chart:NumericalAxis.Title>
                                    <chart:ChartAxisTitle Text="{local:Translate EnergyWhAxisLabel}" FontSize="15" Margin="2"/>
                                </chart:NumericalAxis.Title>
                            </chart:NumericalAxis>
                        </chart:SfChart.SecondaryAxis>
                        <chart:SfChart.Series>
                            <chart:ColumnSeries ItemsSource="{Binding EnergyGraphDataList}"
                                                XBindingPath="Date"
                                                YBindingPath="Value"
                                                Enabletooltip="True"
                                                strokeColor="{StaticResource GraphBlue}"
                                                Color="{StaticResource GraphBlue}"/>
                        </chart:SfChart.Series>
                    </chart:SfChart>
                </StackLayout>
            </Frame>

这是按钮的工作原理:

    private void BetweenYearsTapped()
            {
                IsBusy = true;
    
   
                SelectedFilter = ButtonFilterType.BetweenYears;
                EnergyIntervalUnit = DateTimeIntervalType.Years;
                EnergyScrollingMode = DatetimedeltaType.Years;
    
    
                EnergyGraphDataList.Clear();
                if (EnergyData.EnergyDataYear != null && EnergyData.EnergyDataYear.Count > 0)
                {
                    foreach (var item in EnergyData.EnergyDataYear)
                    {
                        var convertedMarker = Utils.Staticmethods.ConvertMarkerToDateTime(item.Marker);
                        if (convertedMarker >= SelectedPickerOptionA.AddYears(-1) &&
                            convertedMarker.Year <= SelectedPickerOptionB.Year && item.Delta.EGrid > 0)
                            EnergyGraphDataList.Add(new DateContinuousData() { Date = convertedMarker,Value = ((double)item.Delta.EGrid / 1000) });
                    }
                }
    
    
                if (EnergyGraphDataList.Count == 0)
                {
                    EmptyChart = true;
                }
                else
                {
                    EmptyChart = false;
                }
    
    
                IsBusy = false;
            }
    
    
            private void YearTapped()
            {
                IsBusy = true;
    
   
                SelectedFilter = ButtonFilterType.Year;
                EnergyIntervalUnit = DateTimeIntervalType.Months;
                EnergyScrollingMode = DatetimedeltaType.Months;
    
    
                EnergyGraphDataList.Clear();
                if (EnergyData.EnergyDataMonth != null && EnergyData.EnergyDataMonth.Count > 0)
                {
                    foreach (var item in EnergyData.EnergyDataMonth)
                    {
                        var convertedMarker = Utils.Staticmethods.ConvertMarkerToDateTime(item.Marker);
                        if (convertedMarker >= SelectedPickerOptionA.AddMonths(-12) &&
                            convertedMarker <= SelectedPickerOptionB && item.Delta.EGrid > 0)
                            EnergyGraphDataList.Add(new DateContinuousData() { Date = convertedMarker,Value = ((double)item.Delta.EGrid / 1000) });
                    }
                }
    
    
                if (EnergyGraphDataList.Count == 0)
                {
                    EmptyChart = true;
                }
                else
                {
                    EmptyChart = false;
                }
    
    
                IsBusy = false;
            }
    
    
            private void MonthTapped()
            {
                IsBusy = true;
    
   
                SelectedFilter = ButtonFilterType.Month;
    
    
                EnergyGraphDataList.Clear();
                if (EnergyData.EnergyDataDay != null && EnergyData.EnergyDataDay.Count > 0)
                {
                    foreach (var item in EnergyData.EnergyDataDay)
                    {
                        var convertedMarker = Utils.Staticmethods.ConvertMarkerToDateTime(item.Marker);
                        if (convertedMarker >= SelectedPickerOptionA &&
                            convertedMarker <= SelectedPickerOptionB && item.Delta.EGrid > 0)
                            EnergyGraphDataList.Add(new DateContinuousData() { Date = convertedMarker,Value = ((double)item.Delta.EGrid / 1000) });
                    }
                }
    
    
                EnergyIntervalUnit = DateTimeIntervalType.Days;
                EnergyScrollingMode = DatetimedeltaType.Days;
    
    
                if (EnergyGraphDataList.Count == 0)
                {
                    EmptyChart = true;
                }
                else
                {
                    EmptyChart = false;
                }
    
    
                IsBusy = false;
            }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)