折れ線グラフでデータタグを提供する実装をWPFToolkitDataVisualizationからコピーし、少し変更しました。データポイントの横にプロットの値が表示されます。グラフは頻繁に異なるデータで再描画され、これが発生してもデータタグは削除されません。
RemoveDataPoint
基本クラスからメソッドをオーバーライドしてTextBlock
からを削除しようとしましたCanvas
が、これはをスローしていInvalidOperationException
ます(コレクションが変更されたため、列挙子は無効です)。例外が発生する理由は理解していますが、対応するものが削除されTextBlocks
たときに、を削除するにはどうすればよいですか?これは私がこれまでに持っているものです:Canvas
DataPoint
public class DataTagLineSeries : LineSeries
{
private Canvas _labelsCanvas;
private readonly Dictionary<DataPoint, TextBlock> _currentLabels = new Dictionary<DataPoint, TextBlock>();
public bool DisplayLabels { get; set; }
public string LabelBindingPath { get; set; }
public Style LabelStyle { get; set; }
public Point LabelOffset { get; set; }
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
_labelsCanvas = (Canvas)GetTemplateChild("PlotArea");
Clip = null;
}
protected override void UpdateDataPoint(DataPoint dataPoint)
{
base.UpdateDataPoint(dataPoint);
if (DisplayLabels && dataPoint.Visibility == Visibility.Visible)
Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => CreateLabel(dataPoint)));
}
protected override void RemoveDataPoint(DataPoint dataPoint)
{
base.RemoveDataPoint(dataPoint);
if (_currentLabels.ContainsKey(dataPoint))
{
_labelsCanvas.Children.Remove(_currentLabels[dataPoint]);
_currentLabels.Remove(dataPoint);
}
}
private void CreateLabel(DataPoint dataPoint)
{
TextBlock label;
if (_currentLabels.ContainsKey(dataPoint))
{
label = _currentLabels[dataPoint];
}
else
{
label = new TextBlock();
_labelsCanvas.Children.Add(label);
_currentLabels.Add(dataPoint, label);
label.Style = LabelStyle;
var binding = LabelBindingPath != null
? new Binding(LabelBindingPath) { Source = dataPoint.DataContext }
: new Binding("DependentValue") { Source = dataPoint };
BindingOperations.SetBinding(label, TextBlock.TextProperty, binding);
}
var coordinateY = Canvas.GetTop(dataPoint) + LabelOffset.Y;
var coordinateX = Canvas.GetLeft(dataPoint) + LabelOffset.X;
Canvas.SetTop(label, coordinateY);
Canvas.SetLeft(label, coordinateX);
}
}