0

我一直在尝试使用 LVC 合并饼图,效果很好。我一直在玩这个简单的代码... .xml ....

<UserControl x:Class="UI.PieChart"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:UI"
             xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="500"
             d:DataContext = "{d:DesignInstance local:PieChart}">
    <Grid>
        <lvc:PieChart LegendLocation="Bottom" DataClick="Chart_OnDataClick" Hoverable="False" DataTooltip="{x:Null}">
            <lvc:PieChart.Series>
                <lvc:PieSeries Name ="Portion" Title="Maria" Values="3" DataLabels="True"
                               LabelPoint="{Binding PointLabel0}"/>
                <lvc:PieSeries Title="Charles" Values="4" DataLabels="True" 
                               LabelPoint="{Binding PointLabel1}"/>
                <lvc:PieSeries Title="Frida" Values="6" DataLabels="True" 
                               LabelPoint="{Binding PointLabel2}"/>
                <lvc:PieSeries Title="Frederic" Values="2" DataLabels="True" 
                               LabelPoint="{Binding PointLabel3}"/>
            </lvc:PieChart.Series>
        </lvc:PieChart>
    </Grid>
</UserControl>

以及激活用户操作的这段代码...... .xaml.cs

namespace UI
{
    /// <summary>
    /// Interaction logic for DataChart.xaml
    /// </summary>
    public partial class PieChart : UserControl
    {
        public PieChart()
        {
            InitializeComponent();
            PieSeries()
            PointLabel = chartPoint =>
                            string.Format("{0} ({1:P})", chartPoint.Y, chartPoint.Participation);

            DataContext = this;
        }
        public Func<ChartPoint, String> PointLabel { get; set;}

        private void Chart_OnDataClick(object sender, ChartPoint chartpoint)
        {
            var chart = (LiveCharts.Wpf.PieChart) chartpoint.ChartView;

            foreach (PieSeries series in chart.Series)
                series.PushOut = 0;
            var selectedSeries = (PieSeries)chartpoint.SeriesView;
            selectedSeries.PushOut = 8;
        }
    }
}

我对 C#、.xaml、WPF 和 LVC 完全陌生......但我想做的不是硬编码 PIE 图表中的楔形数量。相反,我想根据我提供的数据创建一个饼图。我想在 C# 中执行此操作。当我实例化类 PieChart() 时在哪里。我可以像这样在参数中传递 5,PieChart(5)。然后这将创建 PieChart,然后继续创建 5 个 PieSeries 或 5 个楔形...附带问题,有没有比 LVC 甚至 WPF 更好的工具?

4

1 回答 1

0

一种方法是创建一个 SeriesCollection,根据一些用户输入向其中添加一个 PieSeries 列表,然后将 XAML 中的 PieChart 绑定到 SeriesCollection。您还需要实现 INotifyPropertyChanged 以确保对 SeriesCollection 的更改反映在用户界面中(此处在 RaisePropertyChanged 中实现):

您将绑定到的 SeriesCollection:

    private SeriesCollection myPie = new SeriesCollection();
    public SeriesCollection MyPie
    {
        get
        {
            return myPie;
        }
        set
        {
            myPie = value;
            RaisePropertyChanged("MyPie");
        }
    }

处理一些用户输入的代码(这里基于具有属性 Value 的类 UserInput)。切片的数量将等于您添加到 SeriesCollection 的 PieSeries 的数量:

foreach(item in UserInput)
{
    MyPie.Add(new PieSeries { Values = new ChartValues<int> { item.Value }, DataLabels = true };
}

在您的 XAML 中,将 SeriesCollection 绑定到 PieChart:

<lvc:PieChart Series="{Binding MyPie}"/>
于 2017-10-10T22:51:48.177 回答