4

在我的 WPF 应用程序中,我有一个 D3 ChartPlotter,我可以在其中绘制 4 个 LineGraphs。这是 XAML 代码:

<d3:ChartPlotter Name="plotter">
    <d3:ChartPlotter.HorizontalAxis>
        <d3:HorizontalAxis Name="timeAxis" />
    </d3:ChartPlotter.HorizontalAxis>
    <d3:ChartPlotter.VerticalAxis>
        <d3:VerticalAxis Name="accelerationAxis" />
    </d3:ChartPlotter.VerticalAxis>
</d3:ChartPlotter>

DinamicDataDisplayd3的命名空间在哪里,这是后面的代码(相关部分)。

var x = new List<int>();
var y = new List<int>();
for (var t = 0; t <= 10; t = t + 1) { 
    x.Add(t);
    y.Add(Math.Pow(t,2));
}

var xCoord = new EnumerableDataSource<int>(x);
xCoord.SetXMapping(t => t);
var yCoord = new EnumerableDataSource<int>(y);
yCoord.SetYMapping(k => k);

CompositeDataSource plotterPoints = new CompositeDataSource(xCoord, yCoord);

plotter.AddLineGraph(plotterPoints, Brushes.Red.Color , 2, "MyPlot");

我现在要做的是删除此图并使用一组不同的点重新绘制它。不幸的是,我在 D3 的(糟糕的)文档和网络中都找不到任何朝着这个方向发展的东西。

关于做什么或在哪里看的任何建议?

谢谢!

4

3 回答 3

2

我发现做到这一点的最佳方法是在您的代码中包含一个表示 DataSource 的属性并将图表的 DataSource 绑定到该属性。每次更新或重新分配数据源时,让您的代码实现 INotifyPropertyChanged 并调用 OnPropertyChanged。这将迫使绘图仪观察绑定并重新绘制图表。

例子:

EnumerableDataSource<Point> m_d3DataSource;
public EnumerableDataSource<Point> D3DataSource {
    get {
        return m_d3DataSource;
    }
    set {                
        //you can set your mapping inside the set block as well             
        m_d3DataSource = value;
        OnPropertyChanged("D3DataSource");
    }
}     

protected void OnPropertyChanged(PropertyChangedEventArgs e) {
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null) {
        handler(this, e);
    }
} 

protected void OnPropertyChanged(string propertyName) {
    OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
} 

如果您需要更多信息,我能找到的最佳资源是 D3 所在的 CodePlex 讨论: 讨论

于 2012-10-31T19:04:08.273 回答
1

有一个简单的方法可以做到这一点。如果您的目的是删除绘图仪中的每个图形,只需执行以下操作:

plotterName.Children.RemoveAll((typeof(LineGraph));

希望这对你有用。

于 2015-07-07T09:43:16.523 回答
0

我有一个类似的问题。D3 中有几种不同的 Graph 类型。例如,当您使用 ElementMarkerPoints 时,您必须 RemoveAll((typeof(MarkerPointGraph))。

找出您正在使用的图表类型,然后您可以删除所有图。

编辑:

不要从绘图仪中删除图形。当您需要清除绘图仪时,使用 ObservableDataSource 并删除这些值。当我没记错的时候,否则你会冒内存泄漏的风险,因为这些图不是垃圾收集的。ObservableDataSource 有一个名为 Collection 的属性,只需调用 Clear 方法就可以了:)

于 2016-07-27T14:39:55.347 回答