開發 B/S 架構證券交易大屏幕系統,需繪製指數走勢與成交量圖表,客戶要求畫面清晰且與舊系統風格一致。初次接觸 ChartDirector,文件範例上手快,但細節調整(如 Y 軸縮放、網格線、標籤格式)卻鮮有中文 C# 實戰資料,最終靠 VS IntelliSense 試參數、查字典摸索出完整方案。
輸入:畫布寬高、Y 軸資料陣列 double[] dlChartData。輸出:XYChart 物件。
double dlLin = dlChartData[0], dlMax = dlChartData[0];
string[] XData = new string[2880]; // 固定 2880 個時間點(如 1 分鐘一筆,4.8 小時)
for (int i = 0; i < dlChartData.Length; i++) {
XData[i] = " "; // 實際專案可填入時間字串
if (dlChartData[i] < dlLin) dlLin = dlChartData[i];
if (dlChartData[i] > dlMax) dlMax = dlChartData[i];
}
// 補齊剩餘點位
for (int i = dlChartData.Length; i < 2880; i++) XData[i] = " ";
// 計算相對首點的最大浮動幅度,決定 Y 軸對稱範圍
double dlFir = Math.Abs(m_KPNum - dlLin); // m_KPNum 為昨日收盤價/基準價
double dlSec = Math.Abs(m_KPNum - dlMax);
double dlFloat = Math.Max(dlFir, dlSec);
XYChart c = new XYChart(iWidth, iHeight);
// Y 軸範圍:以基準價為中心,對稱擴展 dlFloat
double dMin = Math.Round(m_KPNum - dlFloat, 2);
double dMax = Math.Round(m_KPNum + dlFloat, 2);
// 保護機制:若範圍過小(波動極小),強制設為基準價 ±0.5%
if ((dMax - dMin) < dlChartData[0] * 0.5) {
dMax = Math.Round(dlChartData[0] + dlChartData[0] * 0.5, 2);
dMin = Math.Round(dlChartData[0] - dlChartData[0] * 0.5, 2);
}
// 關鍵:先設定線性刻度,再設定標籤步進/格式
c.yAxis().setLinearScale(dMin, dMax, (dMax - dMin) / 4); // 固定 4 條網格線
// c.yAxis().setLabelFormat("{value}%"); // 依需求啟用
// c.yAxis().setLabelGap(10); c.yAxis().setLabelStep(...); // 微調標籤顯示
setLinearScale(min, max, step) 必須在 setLabelFormat 之前呼叫;若先設 Label 會導致曲線圖層無法自動生成,需手動添加線圖層。(原文代碼截斷,實務中續接 c.addLineLayer()、c.addBarLayer()、c.addCrossHair() 等。)
c.yAxis().、c.xAxis(). 的 IntelliSense 列舉所有方法,配合 ChartDirector.chm 逐一驗證。c.setAntiAlias(false) 或降低繪圖頻率。ChartDirector.dll,開發機免授權但會有水印。ChartDirector 功能強大、API 細緻,適合金融級圖表呈現。掌握「先設 Scale、後設 Label」、「善用對稱縮放處理微小波動」等核心模式,即能高效產出專業走勢圖。完整專案代碼已應用於生產環境穩定運行兩年餘。