Предельное масштабирование по оси DateTime
Я использую SciChart с DateTimeAxis.
Мои вещи начинаются с 15 мая 2016 года в 8:30 и заканчиваются 25 мая 2016 года в 8:30. Начальное значение VisibleRange также устанавливается в этом диапазоне. Я также добавил VisibleRangeLimit снова с тем же диапазоном.
Но проблема в том, что когда я прокручиваю до углов, значения дат выходят за пределы моего диапазона, и в результате на некоторых уровнях масштабирования я вижу даты вне моего допустимого диапазона, например, 15 мая 2016 г., 8:25. Это вызывает пробел в течение 5 минут.
Есть ли способ действительно ограничить видимый диапазон?
1 ответ
Да, есть,
Из Документации: Обрезка Оси. Видимый Диапазон на Масштаб и Панорамирование.
Усовершенствованное обрезание и управление VisibleRange
Axis.VisibleRangeLimit - это полезный API-интерфейс, позволяющий оси масштабировать VisibleRange при масштабировании до экстентов. Однако это не остановит пользователя от прокрутки за пределами этого диапазона. Для этого вам понадобится небольшая модификация:
Отсечение Axis.VisibleRange в коде
Чтобы обрезать VisibleRange и форсировать определенный максимум или минимум, просто используйте следующий код:
axis.VisibleRangeChanged += (s, e) => { // e is VisibleRangeChangedEventArgs // Assuming axis is NumericAxis if (e.NewVisibleRange != null && e.NewVisibleRange.Min < 0) { // Force minimum visiblerange to zero always ((NumericAxis)sender).VisibleRange = new DoubleRange(0, e.NewVisibleRange.Max); } };
Отсечение оси. VisibleRange с MVVM
То же самое может быть достигнуто в MVVM путем создания пользовательского поведения.
public class AxisClippingBehavior : Behavior<AxisBase> { protected override void OnAttached() { base.OnAttached(); AssociatedObject.VisibleRangeChanged +=OnVisibleRangeChanged; } protected override void OnDetaching() { base.OnDetaching(); AssociatedObject.VisibleRangeChanged -= OnVisibleRangeChanged; } private void OnVisibleRangeChanged(object sender, VisibleRangeChangedEventArgs visibleRangeChangedEventArgs) { var visibleRangeLimit = AssociatedObject.VisibleRangeLimit; if (visibleRangeLimit != null) { var limitMode = AssociatedObject.VisibleRangeLimitMode; var range = (IRange)AssociatedObject.VisibleRange.Clone(); range.ClipTo(visibleRangeLimit, limitMode); AssociatedObject.SetCurrentValue(AxisBase.VisibleRangeProperty, range); } } }