[AntdUI] 14 Chart图表控件的创建

nanyi 16小时前 49


AntdUI中的Chart图表控件,几乎包括了常用的Line折线图,Bar柱状图,Pie面积图等图标类型,但在github中没有对应的文档说明,目前能找到的资料貌似只有这篇,https://blog.csdn.net/gitblog_00202/article/details/151009230,介绍了几种常用图表的属性设置和数据绑定。所以后期需要使用图表控件的话,还是需要借助AAuto来反射AndtUI.dll内部图表相关函数,更方便些。

*AntdUI需要保持2.4.1以上版本,因为在老版本中,HorizontalBar和StackedHorizontalBar会有绘制超出画布边界的情况。

 import win.ui;
import dotNet;
import dotNet.AntdUI;

dotNet.import("AntdUI");
/*DSG{{*/
var winform = win.form(text="AntdUI Chart";right=900;bottom=761;border="thin")
winform.add(
custom_base={cls="custom";left=0;top=0;right=900;bottom=760;db=1;dl=1;dr=1;dt=1;hide=1;z=1};
custom_chart={cls="custom";left=25;top=147;right=875;bottom=655;db=1;dl=1;dr=1;dt=1;z=4};
custom_desc={cls="custom";left=25;top=54;right=875;bottom=84;z=3};
custom_title={cls="custom";left=25;top=15;right=280;bottom=50;z=2};
custom_type={cls="custom";left=27;top=100;right=267;bottom=139;z=5}
)
/*}}*/

// BaseForm
var baseForm = AntdUI.BaseForm();
baseForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
baseForm.Dock = System.Windows.Forms.DockStyle.Fill;
dotNet.setParent(baseForm, winform.custom_base);

// Fonts
var fontTitle = System.Drawing.Font("Microsoft YaHei", 14, System.Drawing.FontStyle.Bold);
var fontDesc = System.Drawing.Font("Microsoft YaHei", 9);

// Title
var title = AntdUI.Label(winform.custom_title);
title.Text = "Chart";
title.Font = fontTitle;

// Description
var desc = AntdUI.Label(winform.custom_desc);
desc.Text = "AntdUI Chart used to display various chart types. Common properties: ChartType, Datasets, ShowGrid, ShowAxes, ShowTooltip, ShowLegend, EnableAnimation.";
desc.Font = fontDesc;

// Chart
var chart = AntdUI.Chart(winform.custom_chart);
chart.Title = "";
chart.TitleFont = System.Drawing.Font("Microsoft YaHei", 12, System.Drawing.FontStyle.Bold);
chart.ShowGrid = true;
chart.ShowAxes = true;
chart.ShowTooltip = true;
chart.ShowLegend = true;
chart.EnableAnimation = true;
chart.AnimationDuration = 600;

// Color helper function
var toNetColor = function(argb){
    if(argb < 0) argb += 0x100000000;
    return System.Drawing.Color.FromArgb(
        (argb >> 24) & 0xFF, (argb >> 16) & 0xFF,
        (argb >> 8) & 0xFF, argb & 0xFF
    );
};

// ★ Antd style 10-color palette (for Pie/Doughnut data point coloring)
var piePalette = [
    0xFFFF6384, // Strawberry Red
    0xFF36A2EB, // Sky Blue
    0xFFFFCE56, // Sunflower Yellow
    0xFF4BC0C0, // Mint Green
    0xFF9966FF, // Lavender Purple
    0xFFFF9F40, // Citrus Orange
    0xFFE7E9ED, // Light Gray
    0xFF4D99FF, // Royal Blue
    0xFF00E396, // Emerald Green
    0xFFF569A6, // Rose Red
];

// ★ Color each data point of a Pie/Doughnut dataset
var colorPieDataset = function(ds, startIndex){
    startIndex = startIndex || 0;
    var e = ds.DataPoints.GetEnumerator();
    var i = startIndex;
    while(e.MoveNext()){
        var dp = e.Current;
        var argb = piePalette[i % #piePalette + 1];
        dp.Color = System.Drawing.Color.FromArgb(
            (argb >> 24) & 0xFF, (argb >> 16) & 0xFF,
            (argb >> 8) & 0xFF, argb & 0xFF
        );
        i++;
    }
    e.Dispose();
};

// ---- Per-chart-type demo data ----
// Enum values: 0=Area, 1=Bar, 2=Bubble, 3=Doughnut, 4=HorizontalBar, 5=Line
// 6=Pie, 7=PolarArea, 8=Radar, 9=Scatter, 10=Spline, 11=SplineArea
// 12=StackedBar, 13=StackedHorizontalBar, 14=SteppedArea, 15=SteppedLine

var fillChartData = function(chartType){
    var ds = chart.Datasets;
    ds.Clear();

    select(chartType){
        case 5 { // Line
            chart.Title = "📈 Monthly Sales Trend";
            var ds1 = AntdUI.ChartDataset("2024");
            ds1.BorderWidth = dotNet.float(2.5);
            ds1.FillColor = 0x20FF6384; ds1.BorderColor = 0xFFFF6384;
            ds1.AddPoint("Jan",1,120);ds1.AddPoint("Feb",2,180);ds1.AddPoint("Mar",3,150);
            ds1.AddPoint("Apr",4,210);ds1.AddPoint("May",5,190);ds1.AddPoint("Jun",6,260);
            ds1.AddPoint("Jul",7,220);ds1.AddPoint("Aug",8,280);ds1.AddPoint("Sep",9,250);
            ds.Add(ds1);
            var ds2 = AntdUI.ChartDataset("2025");
            ds2.BorderWidth = dotNet.float(2.5);
            ds2.FillColor = 0x2036A2EB; ds2.BorderColor = 0xFF36A2EB;
            ds2.AddPoint("Jan",1,140);ds2.AddPoint("Feb",2,200);ds2.AddPoint("Mar",3,170);
            ds2.AddPoint("Apr",4,240);ds2.AddPoint("May",5,220);ds2.AddPoint("Jun",6,290);
            ds2.AddPoint("Jul",7,250);ds2.AddPoint("Aug",8,310);ds2.AddPoint("Sep",9,280);
            ds.Add(ds2);
        }
        case 1 { // Bar
            chart.Title = "📊 Quarterly Revenue Comparison";
            var ds1 = AntdUI.ChartDataset("E-Commerce");
            ds1.BorderWidth = dotNet.float(1.5);
            ds1.FillColor = 0x604FC3F7; ds1.BorderColor = 0xFF4FC3F7;
            ds1.AddPoint("Q1",1,85);ds1.AddPoint("Q2",2,95);ds1.AddPoint("Q3",3,110);ds1.AddPoint("Q4",4,130);
            ds.Add(ds1);
            var ds2 = AntdUI.ChartDataset("Offline");
            ds2.BorderWidth = dotNet.float(1.5);
            ds2.FillColor = 0x60FF8A65; ds2.BorderColor = 0xFFFF8A65;
            ds2.AddPoint("Q1",1,65);ds2.AddPoint("Q2",2,78);ds2.AddPoint("Q3",3,92);ds2.AddPoint("Q4",4,105);
            ds.Add(ds2);
            var ds3 = AntdUI.ChartDataset("New Retail");
            ds3.BorderWidth = dotNet.float(1.5);
            ds3.FillColor = 0x6081C784; ds3.BorderColor = 0xFF81C784;
            ds3.AddPoint("Q1",1,45);ds3.AddPoint("Q2",2,60);ds3.AddPoint("Q3",3,75);ds3.AddPoint("Q4",4,95);
            ds.Add(ds3);
        }
        case 0 { // Area
            chart.Title = "🌊 User Growth Trend";
            var ds1 = AntdUI.ChartDataset("Registered Users");
            ds1.BorderWidth = dotNet.float(2);
            ds1.FillColor = 0x604FC3F7; 
            ds1.BorderColor = 0xFF4FC3F7;
            ds1.Opacity = dotNet.float(0.38);

            ds1.AddPoint("Jan",1,2000);ds1.AddPoint("Feb",2,3500);ds1.AddPoint("Mar",3,2800);
            ds1.AddPoint("Apr",4,4500);ds1.AddPoint("May",5,3800);ds1.AddPoint("Jun",6,5200);
            ds.Add(ds1);
            var ds2 = AntdUI.ChartDataset("Active Users");
            ds2.BorderWidth = dotNet.float(2);
            ds2.FillColor = 0x60BA68C8; 
            ds2.BorderColor = 0xFFBA68C8;
            ds2.Opacity = dotNet.float(0.38);
            ds2.AddPoint("Jan",1,1200);ds2.AddPoint("Feb",2,2100);ds2.AddPoint("Mar",3,1800);
            ds2.AddPoint("Apr",4,3100);ds2.AddPoint("May",5,2600);ds2.AddPoint("Jun",6,3700);
            ds.Add(ds2);
        }
        case 6 { // Pie
            chart.Title = "🎯 Market Share Distribution";
            var ds1 = AntdUI.ChartDataset("2025");
            ds1.BorderWidth = dotNet.float(2);
            ds1.AddPoint("Tencent Cloud",1,35);ds1.AddPoint("Alibaba Cloud",2,28);ds1.AddPoint("Huawei Cloud",3,22);
            ds1.AddPoint("AWS",4,10);ds1.AddPoint("Others",5,5);
            ds.Add(ds1);
            colorPieDataset(ds1); // ★ Color
        }
        case 3 { // Doughnut
            chart.Title = "💍 Budget Allocation";
            var ds1 = AntdUI.ChartDataset("Budget");
            ds1.BorderWidth = dotNet.float(2);
            ds1.AddPoint("R&D",1,40);ds1.AddPoint("Marketing",2,25);ds1.AddPoint("Operations",3,20);
            ds1.AddPoint("HR",4,10);ds1.AddPoint("Others",5,5);
            ds.Add(ds1);
            colorPieDataset(ds1, 2); // ★ Color, offset start index
        }
        case 8 { // Radar
            chart.Title = "🕸️ Product Capability Assessment";
            var ds1 = AntdUI.ChartDataset("Product A");
            ds1.BorderWidth = dotNet.float(2);
            ds1.FillColor = 0x30FF6384; ds1.BorderColor = 0xFFFF6384;
            ds1.AddPoint("Performance",1,92);ds1.AddPoint("Stability",2,88);ds1.AddPoint("UX",3,78);
            ds1.AddPoint("Security",4,96);ds1.AddPoint("Scalability",5,82);ds1.AddPoint("Cost",6,70);
            ds.Add(ds1);
            var ds2 = AntdUI.ChartDataset("Product B");
            ds2.BorderWidth = dotNet.float(2);
            ds2.FillColor = 0x3036A2EB; ds2.BorderColor = 0xFF36A2EB;
            ds2.AddPoint("Performance",1,72);ds2.AddPoint("Stability",2,92);ds2.AddPoint("UX",3,96);
            ds2.AddPoint("Security",4,78);ds2.AddPoint("Scalability",5,88);ds2.AddPoint("Cost",6,92);
            ds.Add(ds2);
        }
       case 9 { // Scatter
    		chart.Title = "✨ Sample Distribution";
    		var ds1 = AntdUI.ChartDataset("Training Set");
    		ds1.BorderWidth = dotNet.float(2);          // 适当加粗边框,让散点更明显
    		ds1.BorderColor = 0xFF4FC3F7;
    		ds1.FillColor = 0x204FC3F7;                 // 半透明填充,增强视觉
    		for(i=1;15){ds1.AddPoint(tostring(i), i, math.random(15,95));}
    		ds.Add(ds1);
    		
    		var ds2 = AntdUI.ChartDataset("Validation Set");
    		ds2.BorderWidth = dotNet.float(2);
    		ds2.BorderColor = 0xFFFF8A65;
    		ds2.FillColor = 0x20FF8A65;                 // 半透明填充,与数据集一区分
    		for(i=1;12){ds2.AddPoint(tostring(i), i + 0.5, math.random(20,90));}
    		ds.Add(ds2);
		}
        case 2 { // Bubble
    		chart.Title = "💎 Project ROI";
    		var ds1 = AntdUI.ChartDataset("Key Projects");
    		ds1.BorderWidth = dotNet.float(1.5);
    		ds1.BorderColor = 0xFF66BB6A;
    		ds1.FillColor = 0x4066BB6A;           // 半透明填充,保留立体感
    		// 气泡图每个点可指定独立半径(第四个参数),若库支持
    		ds1.AddPoint("Project A",1,65,12);
    		ds1.AddPoint("Project B",2,88,18);
    		ds1.AddPoint("Project C",3,72,10);
    		ds1.AddPoint("Project D",4,95,20);
    		ds1.AddPoint("Project E",5,55,8);
    		ds1.AddPoint("Project F",6,80,15);
    		ds.Add(ds1);
		}
        case 7 { // PolarArea
            chart.Title = "🎡 Satisfaction Survey";
            var ds1 = AntdUI.ChartDataset("Score");
            ds1.BorderWidth = dotNet.float(1.5);
            ds1.AddPoint("Product Experience",1,88);ds1.AddPoint("Service Quality",2,76);ds1.AddPoint("Response Speed",3,92);
            ds1.AddPoint("Fair Pricing",4,68);ds1.AddPoint("Feature Completeness",5,84);
            ds.Add(ds1);
            colorPieDataset(ds1, 4); // ★ Color
        }
        case 10 { // Spline
            chart.Title = "〰️ Temperature Trend";
            var ds1 = AntdUI.ChartDataset("Beijing");
            ds1.BorderWidth = dotNet.float(2.5);
            ds1.FillColor = 0x20FF7043; ds1.BorderColor = 0xFFFF7043;
            ds1.AddPoint("Jan",1,-2);ds1.AddPoint("Mar",3,10);ds1.AddPoint("May",5,22);
            ds1.AddPoint("Jul",7,30);ds1.AddPoint("Sep",9,24);ds1.AddPoint("Nov",11,8);
            ds.Add(ds1);
            var ds2 = AntdUI.ChartDataset("Shanghai");
            ds2.BorderWidth = dotNet.float(2.5);
            ds2.FillColor = 0x205C6BC0; ds2.BorderColor = 0xFF5C6BC0;
            ds2.AddPoint("Jan",1,5);ds2.AddPoint("Mar",3,14);ds2.AddPoint("May",5,24);
            ds2.AddPoint("Jul",7,32);ds2.AddPoint("Sep",9,26);ds2.AddPoint("Nov",11,14);
            ds.Add(ds2);
        }
        case 11 { // SplineArea
           chart.Title = "🌊 Rainfall Distribution";
    		var ds1 = AntdUI.ChartDataset("2024");
    		ds1.BorderWidth = dotNet.float(2);
    		ds1.FillColor = 0x5042A5F5; 
    		ds1.BorderColor = 0xFF42A5F5;
    		ds1.Opacity = dotNet.float(0.31);

            ds1.AddPoint("Jan",1,20);ds1.AddPoint("Mar",3,45);ds1.AddPoint("May",5,80);
            ds1.AddPoint("Jul",7,160);ds1.AddPoint("Sep",9,90);ds1.AddPoint("Nov",11,35);
            ds.Add(ds1);
            var ds2 = AntdUI.ChartDataset("2025");
			ds2.BorderWidth = dotNet.float(2);
			ds2.FillColor = 0x50AB47BC; ds2.BorderColor = 0xFFAB47BC;
			ds2.Opacity = dotNet.float(0.31);

            ds2.AddPoint("Jan",1,15);ds2.AddPoint("Mar",3,38);ds2.AddPoint("May",5,72);
            ds2.AddPoint("Jul",7,180);ds2.AddPoint("Sep",9,95);ds2.AddPoint("Nov",11,30);
            ds.Add(ds2);
        }
        case 4 { // HorizontalBar
            chart.Title = "🏆 Product Sales Ranking";
            var ds1 = AntdUI.ChartDataset("Sales (10K units)");
            ds1.BorderWidth = dotNet.float(1.5);
            ds1.FillColor = 0x60FFA726; ds1.BorderColor = 0xFFFFA726;
            ds1.AddPoint("Product A",1,95);ds1.AddPoint("Product B",2,82);ds1.AddPoint("Product C",3,68);
            ds1.AddPoint("Product D",4,55);ds1.AddPoint("Product E",5,42);
            ds.Add(ds1);
        }
        case 12 { // StackedBar
            chart.Title = "📚 Product Sales Breakdown";
            var ds1 = AntdUI.ChartDataset("Online");
            ds1.BorderWidth = dotNet.float(1.5);
            ds1.FillColor = 0x60EF5350; ds1.BorderColor = 0xFFEF5350;
            ds1.AddPoint("Q1",1,45);ds1.AddPoint("Q2",2,52);ds1.AddPoint("Q3",3,60);ds1.AddPoint("Q4",4,75);
            ds.Add(ds1);
            var ds2 = AntdUI.ChartDataset("Offline");
            ds2.BorderWidth = dotNet.float(1.5);
            ds2.FillColor = 0x6042A5F5; ds2.BorderColor = 0xFF42A5F5;
            ds2.AddPoint("Q1",1,35);ds2.AddPoint("Q2",2,38);ds2.AddPoint("Q3",3,42);ds2.AddPoint("Q4",4,50);
            ds.Add(ds2);
            var ds3 = AntdUI.ChartDataset("Channel");
            ds3.BorderWidth = dotNet.float(1.5);
            ds3.FillColor = 0x6066BB6A; ds3.BorderColor = 0xFF66BB6A;
            ds3.AddPoint("Q1",1,25);ds3.AddPoint("Q2",2,30);ds3.AddPoint("Q3",3,35);ds3.AddPoint("Q4",4,45);
            ds.Add(ds3);
        }
        case 13 { // StackedHorizontalBar
            chart.Title = "📋 Team Resource Allocation";
            var ds1 = AntdUI.ChartDataset("Dev");
            ds1.BorderWidth = dotNet.float(1.5);
            ds1.FillColor = 0x60AB47BC; ds1.BorderColor = 0xFFAB47BC;
            ds1.AddPoint("Project A",1,30);ds1.AddPoint("Project B",2,25);ds1.AddPoint("Project C",3,20);
            ds.Add(ds1);
            var ds2 = AntdUI.ChartDataset("Design");
            ds2.BorderWidth = dotNet.float(1.5);
            ds2.FillColor = 0x6026A69A; ds2.BorderColor = 0xFF26A69A;
            ds2.AddPoint("Project A",1,15);ds2.AddPoint("Project B",2,12);ds2.AddPoint("Project C",3,10);
            ds.Add(ds2);
            var ds3 = AntdUI.ChartDataset("Operations");
            ds3.BorderWidth = dotNet.float(1.5);
            ds3.FillColor = 0x60FF7043; ds3.BorderColor = 0xFFFF7043;
            ds3.AddPoint("Project A",1,20);ds3.AddPoint("Project B",2,15);ds3.AddPoint("Project C",3,10);
            ds.Add(ds3);
        }
        case 15 { // SteppedLine
            chart.Title = "📉 Inventory Change Curve";
            var ds1 = AntdUI.ChartDataset("Finished Goods");
            ds1.BorderWidth = dotNet.float(2.5);
            ds1.FillColor = 0x20EC407A; ds1.BorderColor = 0xFFEC407A;
            ds1.AddPoint("Jan",1,120);ds1.AddPoint("Feb",2,95);ds1.AddPoint("Mar",3,130);
            ds1.AddPoint("Apr",4,110);ds1.AddPoint("May",5,145);ds1.AddPoint("Jun",6,125);
            ds.Add(ds1);
            var ds2 = AntdUI.ChartDataset("Raw Materials");
            ds2.BorderWidth = dotNet.float(2.5);
            ds2.FillColor = 0x207E57C2; ds2.BorderColor = 0xFF7E57C2;
            ds2.AddPoint("Jan",1,200);ds2.AddPoint("Feb",2,180);ds2.AddPoint("Mar",3,210);
            ds2.AddPoint("Apr",4,190);ds2.AddPoint("May",5,230);ds2.AddPoint("Jun",6,210);
            ds.Add(ds2);
        }
        case 14 { // SteppedArea
            chart.Title = "🚦 Website Traffic Stats";
            var ds1 = AntdUI.ChartDataset("Desktop");
			ds1.BorderWidth = dotNet.float(2);
			ds1.FillColor = 0x6026C6DA; 
			ds1.BorderColor = 0xFF26C6DA;
			ds1.Opacity = dotNet.float(0.3);
            ds1.AddPoint("Mon",1,8000);ds1.AddPoint("Tue",2,7500);ds1.AddPoint("Wed",3,9000);
            ds1.AddPoint("Thu",4,8500);ds1.AddPoint("Fri",5,7000);ds1.AddPoint("Sat",6,6000);
            ds1.AddPoint("Sun",7,5500);
            ds.Add(ds1);
           var ds2 = AntdUI.ChartDataset("Mobile");
			ds2.BorderWidth = dotNet.float(2);
			ds2.FillColor = 0x60EF5350;
			ds2.BorderColor = 0xFFEF5350;
			ds2.Opacity = dotNet.float(0.2);

            ds2.AddPoint("Mon",1,12000);ds2.AddPoint("Tue",2,11000);ds2.AddPoint("Wed",3,13500);
            ds2.AddPoint("Thu",4,13000);ds2.AddPoint("Fri",5,11000);ds2.AddPoint("Sat",6,9500);
            ds2.AddPoint("Sun",7,8500);
            ds.Add(ds2);
        }
    }
};

// Initialize: Line chart
chart.ChartType = 5;
fillChartData(5);
chart.RefreshChart();

// Type selector
var typeSel = AntdUI.Select(winform.custom_type);
typeSel.Items.Add( AntdUI.SelectItem("Line",5) );
typeSel.Items.Add( AntdUI.SelectItem("Area",0) );
typeSel.Items.Add( AntdUI.SelectItem("Bar",1) );
typeSel.Items.Add( AntdUI.SelectItem("Pie",6) );
typeSel.Items.Add( AntdUI.SelectItem("Doughnut",3) );
typeSel.Items.Add( AntdUI.SelectItem("Radar",8) );
typeSel.Items.Add( AntdUI.SelectItem("Scatter",9) );
typeSel.Items.Add( AntdUI.SelectItem("Bubble",2) );
typeSel.Items.Add( AntdUI.SelectItem("PolarArea",7) );
typeSel.Items.Add( AntdUI.SelectItem("Spline",10) );
typeSel.Items.Add( AntdUI.SelectItem("SplineArea",11) );
typeSel.Items.Add( AntdUI.SelectItem("HorizontalBar",4) );
typeSel.Items.Add( AntdUI.SelectItem("StackedBar",12) );
typeSel.Items.Add( AntdUI.SelectItem("StackedHorizontalBar",13) );
typeSel.Items.Add( AntdUI.SelectItem("SteppedLine",15) );
typeSel.Items.Add( AntdUI.SelectItem("SteppedArea",14) );
typeSel.PrefixText = "Type";
typeSel.PrefixFore = 0xFF6D6D6D;
typeSel.SelectedIndex = 0;


typeSel.SelectedIndexChanged = function(sender,e){
    chart.ChartType = sender.SelectedValue;
    fillChartData(sender.SelectedValue);
    chart.RefreshChart();
};


// ★ Debounce click to prevent multiple firings per single click
var lastPointClickTick = 0;
chart.PointClick = function(sender,e){
    var now = time.tick();
    if(now - lastPointClickTick < 500) return; // Ignore if within 500ms
    lastPointClickTick = now;

    try{
        var p = e.DataPoint;
        if(p && p.Label){
            AntdUI.Message.info(baseForm, p.Label ++ " : " ++ tostring(p.Y));
        }
    }catch(err){}
};

// Dispose fonts on close
winform.onClose = function(){
    fontTitle.Dispose();
    fontDesc.Dispose();
};

winform.show();
win.loopMessage();

最新回复 (5)
  • 我高兴 16小时前
    0 2
    辛苦了大佬
  • 光庆 15小时前
    0 3
    所以,像这种库,只有把功能封装完善,并补全了智能提示,才算可用,不然学习成本太高,一般人也不会用。
  • netfox 12小时前
    0 4
    光庆 所以,像这种库,只有把功能封装完善,并补全了智能提示,才算可用,不然学习成本太高,一般人也不会用。
    代码量精人☀️
  • lcj21 10小时前
    0 5
    真漂亮,感谢分享!
  • nanyi 9小时前
    0 6
    光庆 所以,像这种库,只有把功能封装完善,并补全了智能提示,才算可用,不然学习成本太高,一般人也不会用。
    等GPT 5.6下个更强的版本出来,并且有好的便宜的订阅渠道,我尝试下,看看能不能成。
返回