88 lines
2.5 KiB
C#
88 lines
2.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Windows.Media;
|
|
using System.Windows;
|
|
using System.Windows.Data;
|
|
using System.Diagnostics;
|
|
|
|
namespace Microsoft.Research.DynamicDataDisplay.Charts.Isolines
|
|
{
|
|
public class AdditionalLinesRenderer : IsolineRenderer
|
|
{
|
|
protected override void CreateUIRepresentation()
|
|
{
|
|
InvalidateVisual();
|
|
}
|
|
|
|
protected override void OnPlotterAttached()
|
|
{
|
|
base.OnPlotterAttached();
|
|
|
|
FrameworkElement parent = (FrameworkElement)Parent;
|
|
var renderer = (FrameworkElement)parent.FindName("PART_IsolineRenderer");
|
|
|
|
Binding contentBoundsBinding = new Binding { Path = new PropertyPath("(0)", Viewport2D.ContentBoundsProperty), Source = renderer };
|
|
SetBinding(Viewport2D.ContentBoundsProperty, contentBoundsBinding);
|
|
SetBinding(ViewportPanel.ViewportBoundsProperty, contentBoundsBinding);
|
|
|
|
Plotter2D.Viewport.EndPanning += Viewport_EndPanning;
|
|
Plotter2D.Viewport.PropertyChanged += Viewport_PropertyChanged;
|
|
}
|
|
|
|
void Viewport_PropertyChanged(object sender, ExtendedPropertyChangedEventArgs e)
|
|
{
|
|
if (e.PropertyName == "Visible")
|
|
{
|
|
if (Plotter2D.Viewport.PanningState == Viewport2DPanningState.NotPanning)
|
|
InvalidateVisual();
|
|
}
|
|
}
|
|
|
|
protected override void OnPlotterDetaching()
|
|
{
|
|
Plotter2D.Viewport.EndPanning -= Viewport_EndPanning;
|
|
Plotter2D.Viewport.PropertyChanged -= Viewport_PropertyChanged;
|
|
|
|
base.OnPlotterDetaching();
|
|
}
|
|
|
|
private void Viewport_EndPanning(object sender, EventArgs e)
|
|
{
|
|
InvalidateVisual();
|
|
}
|
|
|
|
protected override void OnRender(DrawingContext drawingContext)
|
|
{
|
|
if (Plotter2D == null) return;
|
|
if (DataSource == null) return;
|
|
|
|
var collection = (IsolineCollection)Parent.GetValue(IsolineCollectionProperty);
|
|
if (collection == null) return;
|
|
|
|
var bounds = ViewportPanel.GetViewportBounds(this);
|
|
if (bounds.IsEmpty) return;
|
|
|
|
var dc = drawingContext;
|
|
var strokeThickness = StrokeThickness;
|
|
|
|
var transform = Plotter2D.Transform.WithRects(bounds, new Rect(RenderSize));
|
|
|
|
//dc.DrawRectangle(null, new Pen(Brushes.Green, 2), new Rect(RenderSize));
|
|
|
|
var additionalLevels = GetAdditionalLevels(collection);
|
|
IsolineBuilder.DataSource = DataSource;
|
|
var additionalIsolineCollections = additionalLevels.Select(level =>
|
|
{
|
|
return IsolineBuilder.BuildIsoline(level);
|
|
});
|
|
|
|
foreach (var additionalCollection in additionalIsolineCollections)
|
|
{
|
|
RenderIsolineCollection(dc, strokeThickness, additionalCollection, transform);
|
|
}
|
|
}
|
|
}
|
|
}
|