【WinForms】C1Chart的问题
使用的是C1 FOR WPF我想让chart的X坐标显示时间,但是有几个问题。第一,缩放到一定程度后会出现重复显示。
第二,时间最小值无法显示到秒,现在只能显示到12:30:10然后就是12:30:15,以5秒为间隔显示,无法满足需求
第三,X轴数据每个之间空的距离太大
第四,如上图,我照着sample里面做了一个游标,请问游标中如何显示时间,现在只可以显示动态的double数据。
第五,请问可否为单独的一个点添加symbols,我看到现在的symbols是直接添加在dataseries上面的,要么全有要么全没有,请问如何设置。
第六,如果charttype使用linesymbols的话,数据超过3000条就会非常卡,严重影响使用。
第七,请问,以时间为X轴的livedata是否可以实现,并同时实现缩放功能 回复 1楼xcy3280019的帖子
第一,很抱歉,我无法重现第一个问题能否把你的测试demo发到论坛调试?
第二,时间最小值无法显示到秒,现在只能显示到12:30:10然后就是12:30:15,以5秒为间隔显示,无法满足需求
》》可以通过this.c1chart1.View.AxisX.MinorUnit 和 this.c1chart1.View.AxisX.MajorUnit 来设置显示单位。
第三,X轴数据每个之间空的距离太大
》》请尝试第二个问题是否能解决这个问题。
第四,如上图,我照着sample里面做了一个游标,请问游标中如何显示时间,现在只可以显示动态的double数据。
》》请问游标指的是什么?C:\Users\icemanwang\Documents\ComponentOne Samples\Studio for WPF\C1.WPF.Chart\CS\ChartSamples\Interaction\ZoomChartControl.xaml 是指的例子中的功能吗?
第五,请问可否为单独的一个点添加symbols,我看到现在的symbols是直接添加在dataseries上面的,要么全有要么全没有,请问如何设置。
》》请问 symbols 具体指什么功能?
第六,如果charttype使用linesymbols的话,数据超过3000条就会非常卡,严重影响使用。
》》如果确实需要,建议进行分批显示。可以通过 x 轴滚动事件分批加载数据。
第七,请问,以时间为X轴的livedata是否可以实现,并同时实现缩放功能
》》livedata 可以参考:C:\Users\icemanwang\Documents\ComponentOne Samples\Studio for WPF\C1.WPF.Chart\CS\ChartSamples\Performance\Dynamic_Net4.xaml 回复 2楼iceman的帖子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections;
using C1.WPF.C1Chart;
namespace ComponentOneTest
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
c1Chart1.BeginUpdate();
int count = 3000;
DateTime[] x = new DateTime;
double[] y = new double;
for (int i = 0; i < count; i++)
{
x = DateTime.Now.AddMinutes(i);
y = i;
}
//X轴设为时间
c1Chart1.View.AxisX.IsTime = true;
c1Chart1.View.AxisX.MinorGridStroke = Brushes.Red;
c1Chart1.View.AxisX.MinorGridStrokeDashes = new DoubleCollection(3);
c1Chart1.View.AxisX.Scale = 1000;
// c1Chart1.View.AxisX.MajorUnit = .1;
c1Chart1.View.AxisX.MinorUnit = .01;
c1Chart1.View.AxisX.AnnoFormat = "MM-dd HH:MM:ss";
//添加数据
XYDataSeries ds = new XYDataSeries()
{
XValuesSource = x,
ValuesSource = y,
ConnectionStrokeThickness = 3,
Label = "hhh",
PointTooltipTemplate = (DataTemplate)Resources["lbl"],
};
c1Chart1.Data.Children.Add(ds);
c1Chart1.View.AxisX.ScrollBar = new AxisScrollBar();
c1Chart1.View.AxisY.ScrollBar = new AxisScrollBar();
c1Chart1.View.AxisY.MinScale = 0.01;
c1Chart1.View.AxisX.MinScale = 0.01;
//Marker
var pnl = new ChartPanel();
var obj = new ChartPanelObject()
{
HorizontalAlignment = HorizontalAlignment.Right,
VerticalAlignment = VerticalAlignment.Bottom,
};
var bdr = new Border()
{
Background = new SolidColorBrush(Colors.Green) { Opacity = 0.4 },
BorderBrush = new SolidColorBrush(Colors.Green),
BorderThickness = new Thickness(1, 1, 3, 3),
CornerRadius = new CornerRadius(6, 6, 0, 6),
Padding = new Thickness(3)
};
var sp = new StackPanel();
var tb1 = new TextBlock();
var bind1 = new Binding();
bind1.Source = ds;
bind1.Path = new PropertyPath("XValuesSource");
tb1.SetBinding(TextBlock.TextProperty, bind1);
var tb2 = new TextBlock();
var bind2 = new Binding();
bind2.Source = obj;
bind2.StringFormat = "数据值={0:#.##}";
bind2.Path = new PropertyPath("DataPoint.Y");
tb2.SetBinding(TextBlock.TextProperty, bind2);
sp.Children.Add(tb1);
sp.Children.Add(tb2);
bdr.Child = sp;
obj.Content = bdr;
obj.DataPoint = new Point();
obj.Action = ChartPanelAction.MouseMove;
pnl.Children.Add(obj);
c1Chart1.View.Layers.Add(pnl);
//曲线类型
c1Chart1.ChartType = ChartType.Line;
c1Chart1.EndUpdate();
// c1Chart1.Actions.Add(new ZoomAction());
}
private void button1_Click(object sender, RoutedEventArgs e)
{
c1Chart1.View.AxisX.Scale = 1;
c1Chart1.View.AxisX.Value = 0.5;
c1Chart1.View.AxisY.Scale = 1;
c1Chart1.View.AxisY.Value = 0.5;
foreach (DataSeries ds in c1Chart1.Data.Children)
{
ds.PointLabelTemplate = null;
}
}
private void c1Chart1_MouseWheel(object sender, MouseWheelEventArgs e)
{
}
}
} 回复 2楼iceman的帖子
<Window.Resources>
<c1:DataPointConverter x:Key="fc"/>
<DataTemplate x:Key="lbl">
<TextBlock x:Name="tb" FontSize="22" Margin="2" Foreground="DarkRed" Text="{Binding Converter={StaticResource fc}, ConverterParameter=数值:\{#Value\}}"/>
</DataTemplate>
</Window.Resources>
<Grid>
<c1:C1Chart MouseWheel="c1Chart1_MouseWheel"Palette="Flow" Name="c1Chart1">
<c1:C1ChartLegend/>
<c1:C1Chart.Actions>
<c1:ZoomAction Fill="#50ffffff" Stroke="Red"/>
<c1:TranslateAction Modifiers="Shift" />
<c1:ScaleAction Modifiers="Control" />
</c1:C1Chart.Actions>
</c1:C1Chart>
<Button Content="Button" Click="button1_Click" Height="23" HorizontalAlignment="Left" Margin="700,0,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
</Grid> 上面两个是我的代码,放大几次之后就会产生如上图的问题。
游标就是图上绿色的那个,代码详见cs中//MARKER之后的代码段。使用的例子是MouseMarker那个
this.c1chart1.View.AxisX.MinorUnit 和 this.c1chart1.View.AxisX.MajorUnit,这两个数据是double类型的,请问如何设置。
XYDataSeries有一个symbolmarker的属性,我说的就是这个,结果是在图上每一个数据点有一个圆标记。
如果还是无法重现的话,请告诉我如何设置才可以使X轴可以完美的显示时间,另外游标可以显示时间,每个数据点可以单独标记即可。 回复 4楼xcy3280019的帖子
重复显示问题,请你通过以下代码测试:
public MainWindow()
{
InitializeComponent();
//c1Chart1.BeginUpdate();
int count = 30;
DateTime[] x = new DateTime;
double[] y = new double;
for (int i = 0; i < count; i++)
{
x = DateTime.Now.AddSeconds(i);
y = i;
}
//X轴设为时间
c1Chart1.View.AxisX.IsTime = true;
c1Chart1.View.AxisX.MinorGridStroke = Brushes.Red;
c1Chart1.View.AxisX.MinorGridStrokeDashes = new DoubleCollection(3);
c1Chart1.View.AxisX.AnnoFormat = "MM-dd HH:mm:ss";
//添加数据
XYDataSeries ds = new XYDataSeries()
{
XValuesSource = x,
ValuesSource = y,
ConnectionStrokeThickness = 3,
Label = "hhh",
// PointTooltipTemplate = (DataTemplate)Resources["lbl"],
};
c1Chart1.Data.Children.Add(ds);
c1Chart1.View.AxisX.ScrollBar = new AxisScrollBar();
c1Chart1.View.AxisY.ScrollBar = new AxisScrollBar();
c1Chart1.View.AxisY.MinScale = 1;
c1Chart1.View.AxisX.MinScale = 1;
c1Chart1.View.AxisX.MajorUnit = 1.157407407407407e-5;
//c1Chart1.View.AxisX.MinorUnit = 1.157407407407407e-5;
//Marker
var pnl = new ChartPanel();
var obj = new ChartPanelObject()
{
HorizontalAlignment = HorizontalAlignment.Right,
VerticalAlignment = VerticalAlignment.Bottom,
};
var bdr = new Border()
{
Background = new SolidColorBrush(Colors.Green) { Opacity = 0.4 },
BorderBrush = new SolidColorBrush(Colors.Green),
BorderThickness = new Thickness(1, 1, 3, 3),
CornerRadius = new CornerRadius(6, 6, 0, 6),
Padding = new Thickness(3)
};
var sp = new StackPanel();
var tb1 = new TextBlock();
var bind1 = new Binding();
bind1.Source = ds;
bind1.Path = new PropertyPath("XValuesSource");
tb1.SetBinding(TextBlock.TextProperty, bind1);
var tb2 = new TextBlock();
var bind2 = new Binding();
bind2.Source = obj;
bind2.StringFormat = "数据值={0.##}";
bind2.Path = new PropertyPath("DataPoint.Y");
tb2.SetBinding(TextBlock.TextProperty, bind2);
sp.Children.Add(tb1);
sp.Children.Add(tb2);
bdr.Child = sp;
obj.Content = bdr;
obj.DataPoint = new Point();
obj.Action = ChartPanelAction.MouseMove;
pnl.Children.Add(obj);
c1Chart1.View.Layers.Add(pnl);
//曲线类型
c1Chart1.ChartType = ChartType.Line;
//c1Chart1.EndUpdate();
// c1Chart1.Actions.Add(new ZoomAction());
}
回复 6楼iceman的帖子
谢谢,请问游标如何显示时间值。 回复 7楼xcy3280019的帖子
问题正在处理中,周一回复。 回复 7楼xcy3280019的帖子
关于 Binding StringFormat 字符格式化上请参考,看是否能解决你的问题:http://www.cnblogs.com/zhengwen/archive/2010/06/19/1761036.html 回复 9楼iceman的帖子
不是stringformat的问题,绑定到的数据是一个double数据,无法转成时间,我绑定到X轴上的数据是DATETIME类型,我如何才能获取到我绑定的数据,代码也在图里面
页:
[1]
2