C# Live Charts如何使用格式化程序

3
我是一名C#新手,也是完全不懂Live Charts的新手。我正在尝试创建一个跨越多天的简单图表。该图表显示了数据,但X轴上的日期标签格式不正确。我认为这是因为我使用了Live Charts Formatter的方式不对。
MainWindow中的XAML:
<lvc:CartesianChart x:Name="RankGraph" Series="{Binding Series}">
<lvc:CartesianChart.AxisX>
<lvc:Axis LabelFormatter="{Binding Formatter}"></lvc:Axis>
</lvc:CartesianChart.AxisX>
</lvc:CartesianChart>

创建图表的函数。

MainWindow _MainWindow = (MainWindow)Application.Current.MainWindow;

//Days
var dayConfig = Mappers.Xy<DateModel>().X(dateModel => dateModel.DateTime.Ticks / TimeSpan.FromDays(1).Ticks).Y(dateModel => dateModel.Value);

Func<double, string> Formatter = value => new DateTime((long)(value * TimeSpan.FromDays(1).Ticks)).ToString("d");

_MainWindow.Formatter = value => new DateTime((long)(value * TimeSpan.FromDays(1).Ticks)).ToString("d");

SeriesCollection Series = new SeriesCollection(dayConfig)
{
    new LineSeries
    {
        Values = new ChartValues<DateModel>
        {
            new Wpf.CartesianChart.Using_DateTime.DateModel
            {
                DateTime    = System.DateTime.Now,
                Value       = 5
            },
            new Wpf.CartesianChart.Using_DateTime.DateModel
            {
                DateTime    = System.DateTime.Now.AddDays(1),
                Value       = 9
            },
            new Wpf.CartesianChart.Using_DateTime.DateModel
            {
                DateTime    = System.DateTime.Now.AddDays(2),
                Value       = 4
            }
        },

        Fill = Brushes.Transparent
    },

};

Application.Current.Dispatcher.Invoke((Action)delegate
{
    if (_MainWindow.ct.IsCancellationRequested) return;

    _MainWindow.RankGraph.Series = Series;

});

我也在mainwindow.cs中设置了格式化程序

public Func<double, string> Formatter   { get; set; }           = value => new DateTime((long)(value * TimeSpan.FromDays(1).Ticks)).ToString("d");

我已经尝试在几乎所有地方声明格式化程序,但看起来XAML并没有使用它。上面的代码生成下面的图表。

enter image description here

如何在创建图表时正确使用Formatter选项,而不是像所有示例显示的那样在UserControl类包装器中使用简单方法。

到目前为止有任何解决方案吗? - Azaz ul Haq
在我的实例中,这是因为我没有将数据内容设置为这个。它在示例中有说明。你遇到了什么问题? - Mr J
2个回答

1

我也注意到了这一点,但我正在使用MVVM,即使我将Formatter = value => value.ToString("N");移动到设置值为ChartValues()SeriesCollection之前,它仍然无法工作。

我的解决方法是:

  1. 给轴命名:
<lvc:CartesianChart.AxisY>
    <lvc:Axis x:Name="SalesGraphAxisY" Title="Sold Apps"></lvc:Axis>
</lvc:CartesianChart.AxisY>

在代码后端。
public MerchandiseAnalysisByCategory()
{
      InitializeComponent();

      Formatter = value => value.ToString("N");
      SalesGraphAxisY.LabelFormatter = Formatter;
}

public Func<double, string> Formatter { get; set; }

确保 Formatter = value => value.ToString("N"); 在第一位。

1

由于某些原因,XAML中的绑定有时不起作用。 您需要在XAML中为LiveCharts控件命名(任何名称):

<lvc:CartesianChart x:Name="RankGraph" Series="{Binding Series}">
<lvc:Axis x:Name="RankGraphAxisX" LabelFormatter="{Binding Formatter}"></lvc:Axis>

然后在代码后端绑定两个系列和LabelFormatter:

RankGraph.Series = Series;
RankGraphAxisX.LabelFormatter = Formatter;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接