using RealTimeGraphEx; using RealTimeGraphEx.Controllers; using System; using System.Collections.Generic; using System.ComponentModel; 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.Animation; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace Tango.MachineStudio.Common.Controls { /// /// Interaction logic for RealTimeGraphControl.xaml /// public partial class RealTimeGraphMultiControl : UserControl , IRealTimeGraph { private Grid headerGrid; #region Properties /// /// Gets or sets the name of the sensor. /// public String SensorName { get { return (String)GetValue(SensorNameProperty); } set { SetValue(SensorNameProperty, value); } } public static readonly DependencyProperty SensorNameProperty = DependencyProperty.Register("SensorName", typeof(String), typeof(RealTimeGraphMultiControl), new PropertyMetadata(null)); /// /// Gets or sets the sensor units. /// public String SensorUnits { get { return (String)GetValue(SensorUnitsProperty); } set { SetValue(SensorUnitsProperty, value); } } public static readonly DependencyProperty SensorUnitsProperty = DependencyProperty.Register("SensorUnits", typeof(String), typeof(RealTimeGraphMultiControl), new PropertyMetadata(null)); public double Minimum { get { return (double)GetValue(MinimumProperty); } set { SetValue(MinimumProperty, value); } } public static readonly DependencyProperty MinimumProperty = DependencyProperty.Register("Minimum", typeof(double), typeof(RealTimeGraphMultiControl), new PropertyMetadata(0.0)); public double Maximum { get { return (double)GetValue(MaximumProperty); } set { SetValue(MaximumProperty, value); } } public static readonly DependencyProperty MaximumProperty = DependencyProperty.Register("Maximum", typeof(double), typeof(RealTimeGraphMultiControl), new PropertyMetadata(100.0)); public void InvalidateGraph() { InnerGraph.Clear(); yAxis.Render(InnerGraph); yAxisTicks.Render(InnerGraph); } /// /// Gets or sets the inner real-time graph control. /// public RealTimeGraphExBase InnerGraph { get; set; } /// /// Gets or sets the inner graph controller. /// public GraphControllerBase Controller { get; set; } private bool _enableToolbar; /// /// Gets or sets a value indicating whether to enable toolbar buttons. /// public bool EnableToolBar { get { return _enableToolbar; } set { _enableToolbar = value; if (!value) { if (headerGrid != null) { ThicknessAnimation ani = new ThicknessAnimation(); ani.To = new Thickness(0, -35, 0, 0); ani.Duration = TimeSpan.FromSeconds(0.2); headerGrid.BeginAnimation(Grid.MarginProperty, ani); } } } } #endregion #region Events public event EventHandler GraphRemoveButtonPressed; public event EventHandler GraphFullScreenButtonPressed; #endregion public RealTimeGraphMultiControl() { InitializeComponent(); EnableToolBar = true; InnerGraph = Graph; Controller = new GraphMultiController(); } private void OnGraphFullScreen(object sender, RoutedEventArgs e) { GraphFullScreenButtonPressed?.Invoke(this, new EventArgs()); } private void Graph_MouseEnter(object sender, MouseEventArgs e) { if (EnableToolBar) { Grid mainGrid = sender as Grid; headerGrid = mainGrid.Children.OfType().ToList().First(); ThicknessAnimation ani = new ThicknessAnimation(); ani.To = new Thickness(0, 0, 0, 0); ani.Duration = TimeSpan.FromSeconds(0.2); headerGrid.BeginAnimation(Grid.MarginProperty, ani); } } private void Graph_MouseLeave(object sender, MouseEventArgs e) { Grid mainGrid = sender as Grid; headerGrid = mainGrid.Children.OfType().ToList().First(); ThicknessAnimation ani = new ThicknessAnimation(); ani.To = new Thickness(0, -35, 0, 0); ani.Duration = TimeSpan.FromSeconds(0.2); headerGrid.BeginAnimation(Grid.MarginProperty, ani); } private void OnGraphRemove(object sender, RoutedEventArgs e) { GraphRemoveButtonPressed?.Invoke(this, new EventArgs()); } } }