Để hiển thị dữ liệu như thế này, tôi thực sự thích DynamicDataDisplay. Thành phần này hiện chỉ được duy trì/phát triển cho Silverlight nhưng có một phiên bản mã nguồn mở (trong liên kết) cho WPF thực sự là một thư viện tuyệt vời.
Thư viện sử dụng IObservable
bộ sưu tập và hỗ trợ DateTime
giá trị trục.
Có loại biểu đồ đánh dấu được tạo sẵn (ví dụ bên dưới).
Bạn có thể sử dụng đánh dấu tùy chỉnh, nó hỗ trợ phóng to và cuộn, nhiều tính năng đẹp khác, v.v. Nó cũng rất nhanh, ngay cả với bộ dữ liệu khá lớn.
Vì bộ dữ liệu là IObservable
thành phần biểu đồ phản ứng động với các thay đổi trong tập dữ liệu cơ bản nên biểu đồ của bạn được cập nhật bất kỳ lúc nào tập hợp dữ liệu được cập nhật.
EDIT
Dưới đây là một ví dụ:
sử dụng:
using System.ComponentModel;
using Microsoft.Research.DynamicDataDisplay;
using Microsoft.Research.DynamicDataDisplay.Charts;
using Microsoft.Research.DynamicDataDisplay.DataSources;
using Microsoft.Research.DynamicDataDisplay.PointMarkers;
chính:
public Window1()
{
InitializeComponent();
//
const int N = 100;
List<double> x = new List<double>();
List<double> y = new List<double>();
DateTimeAxis dtAxis = new DateTimeAxis();
_plotter.HorizontalAxis = dtAxis;
Random rand = new Random();
for (int i = 0; i < N; i++)
{ //generate some random data
x.Add(dtAxis.ConvertToDouble(DateTime.Now.AddDays(i)));
y.Add(rand.Next(N));
}
EnumerableDataSource<double> gX = new EnumerableDataSource<double>(x);
EnumerableDataSource<double> gY = new EnumerableDataSource<double>(y);
_MarkerGraph.DataSource = new CompositeDataSource(gX,gY);
//no scaling - identity mapping
gX.XMapping = xx => xx;
gY.YMapping = yy => yy;
CirclePointMarker mkr = new CirclePointMarker();
mkr.Fill = new SolidColorBrush(Colors.Red);
mkr.Pen = new Pen(new SolidColorBrush(Colors.Black),2.0);
_MarkerGraph.Marker = mkr;
}
XAML:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d3="clr-namespace:Microsoft.Research.DynamicDataDisplay;assembly=DynamicDataDisplay"
Title="Window1" Height="481" Width="651">
<Grid>
<d3:ChartPlotter Name="_plotter">
<d3:MarkerPointsGraph Name="_MarkerGraph"/>
</d3:ChartPlotter>
</Grid>
Output:
Các DateTime trục thang đẹp, điều chỉnh ve cho ngày, tháng, giờ, giây ... bất cứ điều gì là thích hợp. Dễ như ăn bánh!
Nếu bạn sử dụng gói này, tôi cao khuyên bạn nên tải xuống nguồn và thêm nó làm dự án thứ hai cho giải pháp của bạn. Tài liệu này rất kém cho D3 và việc có nguồn trong dự án của bạn là hữu ích để tìm ra cách mọi thứ hoạt động. Nó cũng làm cho nó rất dễ dàng để thêm/mở rộng những thứ nếu bạn cần.Hãy chắc chắn để tham khảo dự án trong giải pháp của bạn nếu bạn làm điều này và không phải là DLL biên dịch.
Cũng lưu ý rằng rất nhiều tài liệu có sẵn và ví dụ trực tuyến được nhắm mục tiêu cho thành phần Silverlight được duy trì và không dành cho thành phần WPF mở. Nhiều thành phần khác nhau giữa hai phiên bản này, do đó bạn phải đào sâu qua thành phần WPF để xem có gì ở đó. Ví dụ trên là dành cho thành phần WP0 v0.3.
Bạn không nên tạo các phần tử theo chương trình và thêm chúng vào lưới như thế. Bạn nên tạo một listatemem datatemplate cho các đốm màu của bạn và sau đó liên kết một tập hợp các đốm màu với một listView. – Alain
Sẽ rất khó để cuộn trơn tru theo cách đó, phải không? Tôi sẽ phải thêm tất cả các dữ liệu vào bộ sưu tập (mà sẽ sụp đổ) hoặc tự động repopulate bộ sưu tập, mà có lẽ sẽ không nhìn trơn tru. – Sugrue