【问题标题】:Call ZoomBy method of SciChart control from ViewModel Class从 ViewModel 类调用 SciChart 控件的 ZoomBy 方法
【发布时间】:2017-04-23 08:28:28
【问题描述】:

我正在尝试从 ViewModel 调用 SciChart 控件的 ZoomBy() 方法。 ZoomBy() 在 xaml.cs 文件中很容易获得,如下所示:

 // TODO: Need to implement zoom using MVVM
    private void BtnZoomIn_Click(object sender, RoutedEventArgs e)
    {
        TemperatureGraph.ChartModifier.XAxis.ZoomBy(-0.1, -0.1);
    }

我需要使用 ViewModel 模式来实现相同的功能。

但是,使用 SciChart 控件的 ViewportManager 可以轻松调用 ZoomExtents 方法。例如。下面:XAML 文件

<RocheButton Name="BtnZoomOut" DockPanel.Dock="Top" Icon="{IconResource Icon=ZoomOut}" HorizontalAlignment="Right" Command="{Binding ZoomOutCommand}" />    
<s:SciChartSurface x:Name="TemperatureGraph" Grid.Column="0" s:ThemeManager.Theme="BrightSpark"  
                           RenderableSeries="{s:SeriesBinding TemperatureGraphViewModel}" DockPanel.Dock="Bottom"
                           ViewportManager="{Binding ViewportManager}">

以及 ViewModel 代码:

    public class TemperatureSummaryGraphViewModel : ViewModelBase
    {
        #region Private Members

        private IXyDataSeries<TimeSpan, double> TemperatureDataSeries = new XyDataSeries<TimeSpan, double>();
        private IXyDataSeries<TimeSpan, double> AcquisitionPointDataSeries = new XyDataSeries<TimeSpan, double>();
        private DefaultViewportManager _viewportManager = new DefaultViewportManager();
        private ICommand _zoomOutCommand;

        #endregion

        #region Constructor

        public TemperatureSummaryGraphViewModel()
        {
            ZoomOutCommand = new DelegateCommand(() => ZoomOutTemperatureGrpah());
            GenerateDummySeries();

            TemperatureGraphViewModel.Add(new LineRenderableSeriesViewModel()
            {
                DataSeries = TemperatureDataSeries,
                StyleKey = "LineSeriesStyle0"
            });

            TemperatureGraphViewModel.Add(new XyScatterRenderableSeriesViewModel()
            {
                DataSeries = AcquisitionPointDataSeries,
                StyleKey = "ScatterSeriesStyle0"
            });
        }

        #endregion

        #region Public Properties

        public ObservableCollection<IRenderableSeriesViewModel> TemperatureGraphViewModel { get; } = new ObservableCollection<IRenderableSeriesViewModel>();

        public IViewportManager ViewportManager
        {
            get
            {
                return _viewportManager;
            }

            set
            {
                if (ReferenceEquals(value, _viewportManager))
                {
                    return;
                }

                _viewportManager = (DefaultViewportManager)value;
                OnPropertyChanged("ViewportManager");
            }
        }

        public ICommand ZoomOutCommand
        {
            get
            {
                return _zoomOutCommand;
            }

            set
            {
                if (ReferenceEquals(value, _zoomOutCommand))
                {
                    return;
                }

                _zoomOutCommand = value;
                OnPropertyChanged(nameof(ZoomOutCommand));
            }
        }

        #endregion

        #region Public Methods

        /// <summary>
        /// To generate dummy data
        /// // TODO: Need to integrate it with RunEditor with the actual data
        /// </summary>
        public void GenerateDummySeries()
        {
            double y = 80.5, yVar = 30.0;

            TemperatureDataSeries.Append(TimeSpan.FromMinutes(1), 40.0);
            TemperatureDataSeries.Append(TimeSpan.FromMinutes(2), 80.5);
            for (int x = 2; x < 50; x++)
            {
                TemperatureDataSeries.Append(TimeSpan.FromMinutes(x), y);

                yVar *= -1;
                y += yVar;
            }

            for (var i = 5.4; i < 50; i += 2)
            {
                AcquisitionPointDataSeries.Append(TimeSpan.FromMinutes(i), 60.0);
            }
        }

        public void ZoomOutTemperatureGrpah()
        {
            _viewportManager.ZoomExtents();
        }

        #endregion
    }
}

此代码运行良好,并将 scichart 控件缩小到 100%。

我想使用ZoomBy() 实现相同的功能。

【问题讨论】:

标签: c# wpf xaml mvvm scichart


【解决方案1】:

由于方法 ZoomZoomByScrollScrollTo 仅存在于 IAxisAxisBase 派生类中,因此从 ViewModel 触发这些方法的唯一方法是实际传递 Axis 实例进入您的 ViewModel。

这不是真正的 MVVM,但它可以被认为是一种解决方法:通过将 Axis 作为 IAxis 传递给 ViewModel 并直接控制它。

唯一的另一种方法是编写一个行为,或SciChart's favourite: a ChartModifier,它侦听来自您的 ViewModel 的事件并直接控制轴。

这是首选方法。如果您搜索“Call method on View from ViewModel”,您将看到在 ViewModel 上引发事件并在 View 中处理的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-19
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2021-11-18
    • 2021-03-14
    相关资源
    最近更新 更多