在我的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>
其中d3
是DinamicDataDisplay的命名空间,这是后面代码的(相关部分)。
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的(差)文档和网络中找到任何方向。
有关做什么或在哪里看的任何建议?
谢谢!
答案 0 :(得分:2)
我发现这样做的最好方法是在代码后面有一个表示DataSource的Property,并将图表的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讨论: Discussions
答案 1 :(得分:1)
有一种简单的方法可以做到这一点。如果您的目的是删除绘图仪中的每个图形,只需执行以下操作:
plotterName.Children.RemoveAll((typeof(LineGraph));
希望这对你有用。
答案 2 :(得分:0)
我有类似的问题。 D3中有几种不同的Graph类型。例如,当您使用ElementMarkerPoints时,您必须删除RemoveAll((typeof(MarkerPointGraph))。
找出您正在使用的图表类型,然后您可以删除所有图表。
编辑:
不要从绘图仪中删除图形。使用ObservableDataSource并在需要清除绘图仪时删除值。当我没记错的时候,你会冒内存泄漏的风险,因为图表不是垃圾收集的。 ObservableDataSource有一个名为Collection的属性,只需调用Clear方法即可,你很好:)