using System; using System.Collections.Generic; using System.Linq; using System.Text; 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; using Aitex.UI.Charting.ViewModel; using Abt.Controls.SciChart; using DataAnalysisControl.Core; namespace Aitex.UI.Charting.View { /// /// Interaction logic for PlotView.xaml /// public partial class PlotView : UserControl { public PlotView() { InitializeComponent(); _viewModel = new PlotViewModel(this); DataContext = _viewModel; IsVisibleChanged += new DependencyPropertyChangedEventHandler(PlotView_IsVisibleChanged); //Loaded += (s, e) => DataContext = _viewModel; sciChart.XAxis.VisibleRangeChanged += new EventHandler(Axis_VisibleRangeChanged); sciChart.YAxis.VisibleRangeChanged += new EventHandler(Axis_VisibleRangeChanged); } void PlotView_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { if ((bool)e.NewValue) { //设置Charting的主题模式 //ThemeManager.SetTheme(sciChart, "ExpressionLight"); //ThemeManager.SetTheme(sciChart, "Chrome"); //ThemeManager.SetTheme(sciChart, "BlackSteel"); //重置Charting的X轴显示区域 _viewModel.ResetXAxisRange2DataSourceRange.Execute(sciChart); } } List> _rangeHistory = new List>(); bool _skipUndo = false; void Axis_VisibleRangeChanged(object sender, Abt.Controls.SciChart.VisibleRangeChangedEventArgs e) { if (!_skipUndo) { try { //System.Diagnostics.Debug.Write("."); if (_rangeHistory.Count > 0 && DateTime.Now - _rangeHistory[_rangeHistory.Count - 1].Item5 < new TimeSpan(0, 0, 0, 0, 500)) { var old = _rangeHistory[_rangeHistory.Count -1]; _rangeHistory[_rangeHistory.Count - 1] = new Tuple(old.Item1, old.Item2, old.Item3, old.Item4, DateTime.Now); System.Diagnostics.Debug.Write("*"); } else { if (_rangeHistory.Count > 100) _rangeHistory.RemoveAt(0); _rangeHistory.Add(new Tuple( sciChart.XAxis.VisibleRange.Min, sciChart.XAxis.VisibleRange.Max, sciChart.YAxis.VisibleRange.Min, sciChart.YAxis.VisibleRange.Max, DateTime.Now)); System.Diagnostics.Debug.Write("#"); } } catch (Exception ex) { CONTEXT.WriteLog(ex); } } } PlotViewModel _viewModel; /// /// 撤销至上一次的视图 /// private void Undo_Last_View_Range() { sciChart.XAxis.AutoRange = Abt.Controls.SciChart.Visuals.Axes.AutoRange.Never; sciChart.YAxis.AutoRange = Abt.Controls.SciChart.Visuals.Axes.AutoRange.Never; if (_rangeHistory.Count > 0) { try { _skipUndo = true; var s1 = (Abt.Controls.SciChart.IRange)sciChart.XAxis.VisibleRange.Clone(); s1.Min = _rangeHistory[_rangeHistory.Count - 1].Item1; s1.Max = _rangeHistory[_rangeHistory.Count - 1].Item2; sciChart.XAxis.VisibleRange = s1; var s2 = (Abt.Controls.SciChart.IRange)sciChart.YAxis.VisibleRange.Clone(); s2.Min = _rangeHistory[_rangeHistory.Count - 1].Item3; s2.Max = _rangeHistory[_rangeHistory.Count - 1].Item4; sciChart.YAxis.VisibleRange = s2; sciChart.YAxis.InvalidateElement(); sciChart.XAxis.InvalidateElement(); _rangeHistory.RemoveAt(_rangeHistory.Count - 1); } catch (Exception ex) { CONTEXT.WriteLog(ex); } finally { _skipUndo = false; } } } /// /// 鼠标双击事件的定义 /// /// /// private void sciChart_MouseDoubleClick(object sender, MouseButtonEventArgs e) { if (e.ChangedButton == MouseButton.Right) { //右键双击,恢复1:1的视图 this.sciChart.ZoomExtents(); } else if (e.ChangedButton == MouseButton.Left) { //左键双击,恢复至上一次的视图比例 Undo_Last_View_Range(); } } /// /// 显示全部数据 /// /// /// private void showAllButton_Click(object sender, RoutedEventArgs e) { this.sciChart.ZoomExtents(); } } }