none
使用Dynamic Data Display控件绘图时无法删除已经画好的曲线 RRS feed

  • 问题

  • 大家好,

    我用Dynamic Data Display控件做了一个实时绘制正弦曲线的程序,想要加上按下BUTTON后停止绘制并且清除已经画好的曲线功能。我在D3的讨论区找到

    plotter.Children.Remove() 这个方法:http://dynamicdatadisplay.codeplex.com/discussions/44783 

    但是在使用中发现并没有实现预期功能,按下删除键确实删除了曲线,但是重新运行时删除的曲线会再次出现。

    代码如下:

    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.Diagnostics;
    using System.Windows.Threading;
    using Microsoft.Research.DynamicDataDisplay;
    using Microsoft.Research.DynamicDataDisplay.DataSources;
    using Microsoft.Research.DynamicDataDisplay.PointMarkers;
    
    namespace WpfDynamicDataDisplay
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            // 动态存储坐标
            private ObservableDataSource<Point> dataSource1 = new ObservableDataSource<Point>();
            private ObservableDataSource<Point> dataSource2 = new ObservableDataSource<Point>();
            // 定时器
            private DispatcherTimer timer = new DispatcherTimer();
            
            private LineGraph graphSin = new LineGraph();
            private LineGraph graphCos = new LineGraph();
    
            // 构造坐标
            Point pointSin = new Point();
            Point pointCos = new Point();
    
            // 绘图刷新标志
            bool newGraph = true;
    
            // X轴
            private uint i1 = 0;
            private uint i2 = 0;
    
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                timer.Interval = TimeSpan.FromMilliseconds(1);
                timer.Tick += SinPlot;
                plotter.Viewport.FitToView();
            }
    
            private void SinPlot(object sender, EventArgs e)
            {
                // axis x
                double x1 = i1++;
                double x2 = (i2 += 2);
    
                // axis y
                double y1 = Math.Sin(x1 * Math.PI / 180);
                double y2 = Math.Cos(x2 * Math.PI / 180);
    
                // 更新Point
                pointSin.X = x1;
                pointSin.Y = y1;
                pointCos.X = x2;
                pointCos.Y = y2;
    
                // 追加至Plot
                dataSource1.AppendAsync(base.Dispatcher, pointSin);
                dataSource2.AppendAsync(base.Dispatcher, pointCos);
            }
    
            private void btStart_Click(object sender, RoutedEventArgs e)
            {
                if (newGraph)
                {
                    graphSin = plotter.AddLineGraph(dataSource1, Colors.DeepSkyBlue, 2, "Sin");
                    graphCos = plotter.AddLineGraph(dataSource2, Colors.DeepPink, 2, "Cos");
                    newGraph = false;
                }
                timer.IsEnabled = true;
                btReset.IsEnabled = false;
            }
    
            private void btStop_Click(object sender, RoutedEventArgs e)
            {
                timer.IsEnabled = false;
                btReset.IsEnabled = true;
            }
    
            private void btReset_Click(object sender, RoutedEventArgs e)
            {
                i1 = 0;
                i2 = 0;
                newGraph = true;
                //plotter.Children.RemoveAll(typeof(LineGraph));
                plotter.Children.Remove(graphSin);
                plotter.Children.Remove(graphCos);
            }
        }
    }
    

    XAML如下:

    <Window x:Class="WpfDynamicDataDisplay.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0"       
            Title="MainWindow" Height="566" Width="700" Loaded="Window_Loaded">
        <Grid Height="528">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="85*" />
                <ColumnDefinition Width="593*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition />
            </Grid.RowDefinitions>
            <d3:ChartPlotter x:Name="plotter" Margin="20,10,20,50" Grid.Row="1" Grid.ColumnSpan="2">          
                <d3:Header Content="Sin &amp; Cos Dynamic Plot"/>
                <d3:VerticalAxisTitle Content="Y"/>
                <d3:HorizontalAxisTitle Content="X"/>
            </d3:ChartPlotter>
            <Button Content="Stop" Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="359,484,0,0" Name="btStop" VerticalAlignment="Top" Width="75" Click="btStop_Click" />
            <Button Content="Start" Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="259,484,0,0" Name="btStart" VerticalAlignment="Top" Width="75" Click="btStart_Click" />
            <Button Content="Reset" Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="459,484,0,0" Name="btReset" VerticalAlignment="Top" Width="75" Click="btReset_Click" />
        </Grid>
    </Window>

    请问该如何解决这个问题,使删除后的作图区回到刚初始化完的状态?

    谢谢


    心若在,梦就在

    2012年5月15日 13:35

答案

  • 问题已经解决。

    原因是绘制曲线用的数据源dataSource1和dataSource2并没有在remove后清除,导致绘图重新开始后仍然保留有上一次的数据。

    解决方法:

    在每次Reset时执行一次 dataSouce = new ObservableDataSource<Point>(); 

    2012年5月16日 9:25

全部回复

  • 问题已经解决。

    原因是绘制曲线用的数据源dataSource1和dataSource2并没有在remove后清除,导致绘图重新开始后仍然保留有上一次的数据。

    解决方法:

    在每次Reset时执行一次 dataSouce = new ObservableDataSource<Point>(); 

    2012年5月16日 9:25
  • 请问怎么获取鼠标所指位置的曲线的坐标?
    2017年5月21日 6:17