using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; namespace RealTimeGraphEx.Components { public abstract class ComponentBase : UserControl { public ComponentLocationEnum Location { get { return (ComponentLocationEnum)GetValue(LocationProperty); } set { SetValue(LocationProperty, value); } } public static readonly DependencyProperty LocationProperty = DependencyProperty.Register("Location", typeof(ComponentLocationEnum), typeof(ComponentBase), new PropertyMetadata(ComponentLocationEnum.None)); public RealTimeGraphExBase Graph { get { return (RealTimeGraphExBase)GetValue(GraphProperty); } set { SetValue(GraphProperty, value); } } public static readonly DependencyProperty GraphProperty = DependencyProperty.Register("Graph", typeof(RealTimeGraphExBase), typeof(ComponentBase), new PropertyMetadata(null)); public ComponentBase() { this.Loaded += ComponentBase_Loaded; } private void ComponentBase_Loaded(object sender, RoutedEventArgs e) { if (Graph != null) { Graph.ZoomComplete += OnGraphZoomComplete; Graph.PanningComplete += OnGraphPanningComplete; Graph.MinMaxChanged += Graph_MinMaxChanged; Render(Graph); } } private void Graph_MinMaxChanged(object sender, EventArgs e) { OnGraphMinMaxChanged(); } public abstract void Render(RealTimeGraphExBase graph, bool animate = false); public void RemoveFromParent() { var parent = this.Parent; var child = this; var panel = parent as Panel; if (panel != null) { panel.Children.Remove(child); return; } var decorator = parent as Decorator; if (decorator != null) { if (decorator.Child == child) { decorator.Child = null; } return; } var contentPresenter = parent as ContentPresenter; if (contentPresenter != null) { if (contentPresenter.Content == child) { contentPresenter.Content = null; } return; } var contentControl = parent as ContentControl; if (contentControl != null) { if (contentControl.Content == child) { contentControl.Content = null; } return; } // maybe more } protected virtual void OnGraphZoomComplete(Point transformOrigin, double scaleX, double scaleY) { } protected virtual void OnGraphPanningComplete(Point translate) { } protected virtual void OnGraphMinMaxChanged() { } } }