项目最终效果展示
此项目安全,主要是涉及 AmCharts.Windows.Stock控件的使用,核心代码如下
股票对象
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WPFamChartsK线制作.Model
{
/// <summary>
/// 股票信息
/// </summary>
public class StockInfo
{
/// <summary>
/// 时间
/// </summary>
public DateTime Date { get; set; }
/// <summary>
/// 开盘价
/// </summary>
public double Open { get; set; }
/// <summary>
/// 最高价
/// </summary>
public double High { get; set; }
/// <summary>
/// 最低价
/// </summary>
public double Low { get; set; }
/// <summary>
/// 收盘价
/// </summary>
public double Close { get; set; }
/// <summary>
/// 成交量
/// </summary>
public double Volume { get; set; }
public string Descipt { get; set; }
}
}
ViewModel
using System;
using System.Collections.ObjectModel;
using System.IO;
using System.Text;
using System.Windows.Input;
using WPFamChartsK线制作.Model;
namespace WPFamChartsK线制作.ViewModel
{
public class MainWindowViewModel : ViewModel
{
public MainWindowViewModel()
{
}
private ObservableCollection<StockInfo> _Data=new ObservableCollection<StockInfo>();
public ObservableCollection<StockInfo> Data
{
get { return this._Data; }
set
{
this._Data = value;
RaisePropertyChanged(() => Data);
}
}
private string _StockName;
public string StockName
{
get { return this._StockName; }
set
{
this._StockName = value;
RaisePropertyChanged(() => StockName);
}
}
private ICommand _LoadStock;
public ICommand LoadStockCommand
{
get
{
if (this._LoadStock == null)
this._LoadStock = new RelayCommandBase(LoadStockAction);
return this._LoadStock;
}
}
private void LoadStockAction(object obj)
{
string fileName = "SH600747.TXT";
LoadStockInfo(fileName);
}
//SH600747.TXT
private void LoadStockInfo(string fileName="SH600747.TXT")
{
using (System.IO.Stream resourceStream = new FileStream(fileName, FileMode.Open))
{
using (StreamReader reader = new StreamReader(resourceStream, Encoding.GetEncoding("GB2312")))
{
//读每一行
var strings = reader.ReadToEnd().Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
//获取股票名称
StockName = strings[0].Replace("\r", "");
var res = new ObservableCollection<StockInfo>();
//第一行是股票名称, 第二行是类型名称, 第3行才是股票数据
for (int i = 2; i < strings.Length; i++)
{
string line = strings[i];
string[] subLines = line.Split('\t');
DateTime date = DateTime.Parse(subLines[0]);
Double open = Double.Parse(subLines[1]);
Double high = Double.Parse(subLines[2]);
Double low = Double.Parse(subLines[3]);
Double close = Double.Parse(subLines[4]);
Double volumn = Double.Parse(subLines[5]);
_Data.Add(
new StockInfo
{
Date = date,
Open = open,
High = high,
Low = low,
Close = close,
Volume = volumn,
Descipt = "暂时没什么提醒"
});
}
}
}
}
}
}
XAML前端
<Window x:Class="WPFamChartsK线制作.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ams="http://schemas.amcharts.com/stock/wpf/2009/xaml"
xmlns:local="clr-namespace:WPFamChartsK线制作"
mc:Ignorable="d"
Title="WPF 股票K线图 " Height="450" Width="800">
<Grid Margin="10,0,10,0">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ams:StockChart Name="stockChart" Grid.Row="0">
<ams:StockChart.DataSets>
<ams:DataSet Name="stockSet1" Brush="#7f8da9"
ItemsSource="{Binding Data}"
DateMemberPath="Date"
OpenMemberPath="Open"
HighMemberPath="High"
LowMemberPath="Low"
CloseMemberPath="Close"
Description="Descipt"
ValueMemberPath="Close"
VolumeMemberPath="Volume"
/>
</ams:StockChart.DataSets>
<ams:StockChart.Charts>
<ams:Chart Title="股票价格" GridHeight="2*">
<ams:Chart.Graphs>
<ams:Graph GraphType="Candlestick" Title="{Binding StockName}"
NegativeBrush="Green" PositiveBrush="Red"
LegendItemType="Ohlc" LegendPeriodItemType="Ohlc"
CursorBrush="Blue" CursorSize="6" />
</ams:Chart.Graphs>
<ams:Chart.DateTimeAxis>
<ams:DateTimeAxis ValuesForeground="#90000000" StrokeThickness="0" TickLength="0"
/>
</ams:Chart.DateTimeAxis>
<ams:Chart.LeftValueAxis>
<ams:ValueAxis ValuesForeground="#90000000"
StrokeThickness="0" TickLength="0" />
</ams:Chart.LeftValueAxis>
<ams:Chart.Legend>
<ams:Legend
PositiveValueForeground="Red" NegativeValueForeground="Green"
IsDateVisible="True"/>
</ams:Chart.Legend>
</ams:Chart>
<!--成交量的Chart-->
<ams:Chart Title="成交量">
<ams:Chart.Graphs>
<ams:Graph GraphType="Column" Title="{Binding StockName}"
LegendItemType="Value" LegendPeriodItemType="Value"
DataField="Volume" PeriodValue="Sum"
CursorBrush="Blue" CursorSize="6" />
</ams:Chart.Graphs>
<ams:Chart.DateTimeAxis>
<ams:DateTimeAxis ValuesEnabled="False" StrokeThickness="0" />
</ams:Chart.DateTimeAxis>
<ams:Chart.LeftValueAxis>
<ams:ValueAxis ValuesForeground="#90000000" StrokeThickness="0" TickLength="0" />
</ams:Chart.LeftValueAxis>
<ams:Chart.Legend>
<ams:Legend PositiveValueForeground="Red" NegativeValueForeground="Green" />
</ams:Chart.Legend>
</ams:Chart>
</ams:StockChart.Charts>
<ams:StockChart.PeriodSelector>
<ams:PeriodSelector CustomPeriodLabelText="自定义间隔:" PresetPeriodLabelText="缩放:" Margin="0,5,0,0">
<ams:PeriodSelector.PresetPeriods>
<ams:PresetPeriodButton Interval="Day" Quantity="10" ToolTipService.ToolTip="10天" Content="10天" />
<ams:PresetPeriodButton Interval="Month" Quantity="1" ToolTipService.ToolTip="1个月" Content="1月" />
<ams:PresetPeriodButton Interval="Month" Quantity="3" ToolTipService.ToolTip="3个月" Content="3月" />
<ams:PresetPeriodButton Interval="Year" Quantity="1" ToolTipService.ToolTip="1年" Content="1年" />
<ams:PresetPeriodButton Interval="Year" Quantity="3" ToolTipService.ToolTip="3年" Content="3年" />
<ams:PresetPeriodButton Quantity="NaN" ToolTipService.ToolTip="所有数据" Content="最大" />
</ams:PeriodSelector.PresetPeriods>
</ams:PeriodSelector>
</ams:StockChart.PeriodSelector>
</ams:StockChart>
<StackPanel Grid.Row="1">
<Button Command="{Binding LoadStockCommand}" Content="加载"/>
</StackPanel>
</Grid>
</Window>