Предельное масштабирование по оси 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);
        }
    }
}                   
Другие вопросы по тегам