xcy3280019 发表于 2013-12-25 21:41:00

【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是否可以实现,并同时实现缩放功能

iceman 发表于 2013-12-26 13:28:00

回复 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

xcy3280019 发表于 2013-12-26 13:59:00

回复 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)
      {

      }

    }
}

xcy3280019 发表于 2013-12-26 14:00:00

回复 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>

xcy3280019 发表于 2013-12-26 14:11:00

上面两个是我的代码,放大几次之后就会产生如上图的问题。
游标就是图上绿色的那个,代码详见cs中//MARKER之后的代码段。使用的例子是MouseMarker那个
this.c1chart1.View.AxisX.MinorUnit 和 this.c1chart1.View.AxisX.MajorUnit,这两个数据是double类型的,请问如何设置。
XYDataSeries有一个symbolmarker的属性,我说的就是这个,结果是在图上每一个数据点有一个圆标记。

如果还是无法重现的话,请告诉我如何设置才可以使X轴可以完美的显示时间,另外游标可以显示时间,每个数据点可以单独标记即可。

iceman 发表于 2013-12-26 17:51:00

回复 4楼xcy3280019的帖子

重复显示问题,请你通过以下代码测试:

public MainWindow()
      {
            InitializeComponent();
            //c1Chart1.BeginUpdate();
            int count = 30;
            DateTime[] x = new DateTime;
            double[] y = new double;
            for (int i = 0; i &lt; 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 = &quot;MM-dd HH:mm:ss&quot;;
            //添加数据
            XYDataSeries ds = new XYDataSeries()
            {
                XValuesSource = x,
                ValuesSource = y,
                ConnectionStrokeThickness = 3,
                Label = &quot;hhh&quot;,
               // PointTooltipTemplate = (DataTemplate)Resources[&quot;lbl&quot;],
            };
            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(&quot;XValuesSource&quot;);
            tb1.SetBinding(TextBlock.TextProperty, bind1);

            var tb2 = new TextBlock();
            var bind2 = new Binding();
            bind2.Source = obj;
            bind2.StringFormat = &quot;数据值={0.##}&quot;;
            bind2.Path = new PropertyPath(&quot;DataPoint.Y&quot;);
            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());
      }

xcy3280019 发表于 2013-12-27 08:59:00

回复 6楼iceman的帖子

谢谢,请问游标如何显示时间值。

iceman 发表于 2013-12-27 18:45:00

回复 7楼xcy3280019的帖子

问题正在处理中,周一回复。

iceman 发表于 2013-12-30 12:15:00

回复 7楼xcy3280019的帖子

关于 Binding StringFormat 字符格式化上请参考,看是否能解决你的问题:http://www.cnblogs.com/zhengwen/archive/2010/06/19/1761036.html

xcy3280019 发表于 2013-12-30 13:35:00

回复 9楼iceman的帖子



不是stringformat的问题,绑定到的数据是一个double数据,无法转成时间,我绑定到X轴上的数据是DATETIME类型,我如何才能获取到我绑定的数据,代码也在图里面
页: [1] 2
查看完整版本: 【WinForms】C1Chart的问题