WPF 关于 DevExpress 里chartControl的问题

a154509543 2017-04-27 05:39:54
百度里很少有关于DevExpress的文档,博客和心得,万般无奈,求助大家。
问题是:如何动态的在chartControl里画线
详情:

class Record
{
DateTime date;
int num;
}
List<Record> recordlist = new List<Record>();
chartcontrol.datasource = recordlist;



<dxc:ChartControl x:Name="chartcontrol1" HorizontalAlignment="Left" VerticalAlignment="Top">
<dxc:ChartControl.Diagram>
<dxc:XYDiagram2D SeriesDataMember="date">
<dxc:LineSeries2D ArgumentDataMember="date" ValueDataMember="num" />
<dxc:XYDiagram2D.AxisX>
<dxc:AxisX2D Interlaced="True">
<dxc:AxisX2D.DateTimeScaleOptions>
<dxc:ContinuousDateTimeScaleOptions></dxc:ContinuousDateTimeScaleOptions>
</dxc:AxisX2D.DateTimeScaleOptions>
</dxc:AxisX2D>
</dxc:XYDiagram2D.AxisX>
</dxc:XYDiagram2D>
</dxc:ChartControl.Diagram>
<dxc:ChartControl.Legend>
<dxc:Legend />
</dxc:ChartControl.Legend>
</dxc:ChartControl>

如果我list 一开始有数据,那么还好说 图表上会有显示一条对应的线图。
但是如果我的list是无止境递增的(先别考虑内存撑爆的问题)。
date是当前时间 比方我每秒add一个record,想要的效果图是这样的(不知道图片是否上传成功了):

没有很好地解决办法去动态的画成这样。我这个效果图是静态的。

...全文
932 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
如何动态的在chartControl里画线

-》使用ObservableCollection<Record> 动态数据集合(注意要实现INotifyPropertyChanged接口),使用Binding方式,不要在后台 chartcontrol.datasource=List 这样设置数据源,而是在xaml中:DataSource="{Binding ListRecord}"。我使用了一个DispatcherTimer模拟定时,这是例子效果:


wxstar8 2017-04-28
  • 打赏
  • 举报
回复
可以用定时器去定时采集数据并绑定显示。假设你要显示100个点,当List<>中的数据大于100时,删除最早的数据。
wxstar8 2017-04-28
  • 打赏
  • 举报
回复
一般用Devxpress控件,可以下载一个demo,里面可以找到你要用的控件的例子可以参考。


遇到问题可以去:Devxpress support center中去找答案。在里面会有devxpress的技术支持提供的解决方法。希望对你有用
https://www1.devexpress.com/Support/Center/Search/List/1
  • 打赏
  • 举报
回复
引用 7 楼 a154509543 的回复:
好的 很感谢你的耐心指导~ 我去尝试一下 binding的方法,虽然我已经用了ObservableCollection在后端去datasource = recordlist, 也能够正常使用,但是不知为何 我软件运行一段时间就卡着不动了,看任务管理器也没有内存占用100% 可否解释一下为何卡死。
不清楚你软件里都是什么操作,无法解释。
a154509543 2017-04-28
  • 打赏
  • 举报
回复
引用 6 楼 duanzi_peng 的回复:
[quote=引用 4 楼 a154509543 的回复:] 谢谢你的回答 我今天也想到在xaml里用 Binding ListRecord 但是 这个listRecord我得从哪里引用进来,还是它自己会找到code里?
需要使用WPF的绑定机制了。“事件通知” 在绑定机制中启重要作用,也就是任何类对象实现INotifyPropertyChanged 接口,并实现它的PropertyChanged方法,类似:

 public event PropertyChangedEventHandler PropertyChanged=delegate{};
        public void OnChangeProperty(string name)
        {
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(name));
        }
这样在定义 属性的时候:

 private ObservableCollection<Record> records = new ObservableCollection<Record>();
        public ObservableCollection<Record> ListRecord
        {
            get
            {
                return records;
            }
            set
            {
                records = value;
                OnChangeProperty("ListRecord");  // 使用更新方法
            }
        }
比如窗体类实现INotifyPropertyChanged接口:

 public partial class xxxxxWindow : Window, INotifyPropertyChanged
 // 省略部分代码
这个时候必须在窗体类的默认构造函数里指定 该窗体的 数据上下为 DataContext:

  public xxxxxWindow()
        {
            this.DataContext = this;
            InitializeComponent();
        }
这样就可以使用Binding方式 设置数据源以及各种属性。 在xaml中使用Binding 到对应集合就可以完成 数据变化通知!很容易理解,希望花几分钟理解,而不是代码粘贴过去实现功能就行了。[/quote] 好的 很感谢你的耐心指导~ 我去尝试一下 binding的方法,虽然我已经用了ObservableCollection在后端去datasource = recordlist, 也能够正常使用,但是不知为何 我软件运行一段时间就卡着不动了,看任务管理器也没有内存占用100% 可否解释一下为何卡死。
  • 打赏
  • 举报
回复
引用 4 楼 a154509543 的回复:
谢谢你的回答 我今天也想到在xaml里用 Binding ListRecord 但是 这个listRecord我得从哪里引用进来,还是它自己会找到code里?
需要使用WPF的绑定机制了。“事件通知” 在绑定机制中启重要作用,也就是任何类对象实现INotifyPropertyChanged 接口,并实现它的PropertyChanged方法,类似:

 public event PropertyChangedEventHandler PropertyChanged=delegate{};
        public void OnChangeProperty(string name)
        {
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(name));
        }
这样在定义 属性的时候:

 private ObservableCollection<Record> records = new ObservableCollection<Record>();
        public ObservableCollection<Record> ListRecord
        {
            get
            {
                return records;
            }
            set
            {
                records = value;
                OnChangeProperty("ListRecord");  // 使用更新方法
            }
        }
比如窗体类实现INotifyPropertyChanged接口:

 public partial class xxxxxWindow : Window, INotifyPropertyChanged
 // 省略部分代码
这个时候必须在窗体类的默认构造函数里指定 该窗体的 数据上下为 DataContext:

  public xxxxxWindow()
        {
            this.DataContext = this;
            InitializeComponent();
        }
这样就可以使用Binding方式 设置数据源以及各种属性。 在xaml中使用Binding 到对应集合就可以完成 数据变化通知!很容易理解,希望花几分钟理解,而不是代码粘贴过去实现功能就行了。
a154509543 2017-04-28
  • 打赏
  • 举报
回复
引用 2 楼 wxstar8 的回复:
可以用定时器去定时采集数据并绑定显示。假设你要显示100个点,当List<>中的数据大于100时,删除最早的数据。
谢谢你的回答, 我现在准备是用定时器去updateData().其实这个比较笨 我觉得3楼给的主意很不错,我待会试试。 但是DevExpress里确实没这个回答 不然我也不会花大把积分来求助~
a154509543 2017-04-28
  • 打赏
  • 举报
回复
引用 3 楼 duanzi_peng 的回复:
如何动态的在chartControl里画线 -》使用ObservableCollection<Record> 动态数据集合(注意要实现INotifyPropertyChanged接口),使用Binding方式,不要在后台 chartcontrol.datasource=List 这样设置数据源,而是在xaml中:DataSource="{Binding ListRecord}"。我使用了一个DispatcherTimer模拟定时,这是例子效果:
谢谢你的回答 我今天也想到在xaml里用 Binding ListRecord 但是 这个listRecord我得从哪里引用进来,还是它自己会找到code里?

8,757

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧