using RealTimeGraphX.EventArguments; using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; 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; namespace RealTimeGraphX.WPF.Components { /// /// Represents a horizontal/vertical graph axis control. /// /// public class GraphAxisControl : GraphSurfaceComponentBase { private ItemsControl _items_control; /// /// Initializes the class. /// static GraphAxisControl() { DefaultStyleKeyProperty.OverrideMetadata(typeof(GraphAxisControl), new FrameworkPropertyMetadata(typeof(GraphAxisControl))); } /// /// Gets or sets the control orientation. /// public Orientation Orientation { get { return (Orientation)GetValue(OrientationProperty); } set { SetValue(OrientationProperty, value); } } public static readonly DependencyProperty OrientationProperty = DependencyProperty.Register("Orientation", typeof(Orientation), typeof(GraphAxisControl), new PropertyMetadata(Orientation.Vertical)); /// /// Gets or sets the tick item template. /// public DataTemplate ItemTemplate { get { return (DataTemplate)GetValue(ItemTemplateProperty); } set { SetValue(ItemTemplateProperty, value); } } public static readonly DependencyProperty ItemTemplateProperty = DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), typeof(GraphAxisControl), new PropertyMetadata(null)); /// /// Gets or sets the tick items. /// internal ObservableCollection Items { get { return (ObservableCollection)GetValue(ItemsProperty); } set { SetValue(ItemsProperty, value); } } public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register("Items", typeof(ObservableCollection), typeof(GraphAxisControl), new PropertyMetadata(null)); /// /// Gets or sets the number of ticks to display on the control. /// public int Ticks { get { return (int)GetValue(TicksProperty); } set { SetValue(TicksProperty, value); } } public static readonly DependencyProperty TicksProperty = DependencyProperty.Register("Ticks", typeof(int), typeof(GraphAxisControl), new PropertyMetadata(9, (d, e) => (d as GraphAxisControl).OnTicksChanged())); /// /// Gets or sets the string format which is used to format the ticks value. /// public String StringFormat { get { return (String)GetValue(StringFormatProperty); } set { SetValue(StringFormatProperty, value); } } public static readonly DependencyProperty StringFormatProperty = DependencyProperty.Register("StringFormat", typeof(String), typeof(GraphAxisControl), new PropertyMetadata(null)); /// /// When overridden in a derived class, is invoked whenever application code or internal processes call . /// public override void OnApplyTemplate() { base.OnApplyTemplate(); _items_control = GetTemplateChild("PART_ItemsControl") as ItemsControl; OnTicksChanged(); } /// /// Called when the property has changed. /// protected virtual void OnTicksChanged() { Items = new ObservableCollection(Enumerable.Range(0, Ticks).Select(x => new GraphAxisTickData())); } /// /// Called when surface painter has changed. /// /// The painter. protected override void OnSurfacePainterChanged(IGraphPainter painter) { base.OnSurfacePainterChanged(painter); if (!this.IsInDesignMode()) { painter.VirtualRangeXChanged += Painter_VirtualRangeXChanged; painter.VirtualRangeYChanged += Painter_VirtualRangeYChanged; } } /// /// Handles the VirtualRangeYChanged event of the surface painter. /// /// The source of the event. /// The instance containing the event data. private void Painter_VirtualRangeYChanged(object sender, RangeChangedEventArgs e) { InvokeUI(() => { if (Orientation == Orientation.Vertical) { if (Items != null && e.Minimum != null && e.Maximum != null) { var steps = e.Minimum.CreateRange(e.Minimum, e.Maximum, Ticks).Reverse().ToList(); for (int i = 0; i < steps.Count; i++) { var tick_data = Items[i]; tick_data.Data = steps[i]; tick_data.IsFirst = i == 0; tick_data.IsLast = i == steps.Count - 1; tick_data.IsEven = i % 2 == 0; } } } }); } /// /// Handles the VirtualRangeXChanged event of the surface painter. /// /// The source of the event. /// The instance containing the event data. private void Painter_VirtualRangeXChanged(object sender, RangeChangedEventArgs e) { InvokeUI(() => { if (Orientation == Orientation.Horizontal) { if (Items != null) { var steps = e.Minimum.CreateRange(e.Minimum, e.Maximum, Ticks).ToList(); for (int i = 0; i < steps.Count; i++) { var tick_data = Items[i]; tick_data.Data = steps[i]; tick_data.IsFirst = i == 0; tick_data.IsLast = i == steps.Count - 1; tick_data.IsEven = i % 2 == 0; } } } }); } } }