График Microsoft Silverlight с нечетным интервалом

В простом элементе управления диаграммой Microsoft в Silverlight дни одного месяца отображаются в виде дат на оси X и двойных значений на оси Y. Я хотел бы отображать каждый второй день на оси X, но эти дни должны быть нечетными днями.

Если я устанавливаю IntervalType = "Days" и Interval = "2", нумерация всегда начинается со дня 2. Даже если я помещаю фиктивную дату впереди или в конце, или и то, и другое.

Вместо: __ 02 __ 04 __ 06 __ 08 __ 10 ...

Мне нужно: 01 __ 03 __ 05 __ 07 ...

Как я могу добиться этого самым простым способом?


person Germstorm    schedule 07.03.2011    source источник
comment
Вы обращаетесь к диаграммам в наборе инструментов?   -  person AnthonyWJones    schedule 07.03.2011


Ответы (1)


Пример набора 31.01 -> 1.02 -> 3.02 вместо 31.01 -> 2.02. В этом случае единственный способ - написать пользовательский Axis, аналогичный DateTimeAxis.

Сначала скопируйте в свой проект следующие файлы:

  • c: \ Program Files \ Microsoft SDKs \ Silverlight \ v4.0 \ Toolkit \ Apr10 \ Source \ Source code.zip \ Controls.DataVisualization.Toolkit \ EnumerableFunctions.cs
  • c: \ Program Files \ Microsoft SDKs \ Silverlight \ v4.0 \ Toolkit \ Apr10 \ Source \ Source code.zip \ Controls.DataVisualization.Toolkit \ ValueHelper.cs

Скопируйте эти файлы с точно таким же пространством имен, они являются внутренними, поэтому конфликта имен не будет. Затем добавьте расширенный класс для DateTimeIntervalType:

namespace System.Windows.Controls.DataVisualization.Charting
{
    /// <summary>
    /// A date time interval.
    /// </summary>
    public enum ExtendedDateTimeIntervalType
    {
        /// <summary>
        /// Automatically determine interval.
        /// </summary>
        Auto = 0,

        /// <summary>
        /// Interval type is milliseconds.
        /// </summary>
        Milliseconds = 1,

        /// <summary>
        /// Interval type is seconds.
        /// </summary>
        Seconds = 2,

        /// <summary>
        /// Interval type is minutes.
        /// </summary>
        Minutes = 3,

        /// <summary>
        /// Interval type is hours.
        /// </summary>
        Hours = 4,

        /// <summary>
        /// Interval type is days.
        /// </summary>
        Days = 5,

        /// <summary>
        /// Interval type is weeks.
        /// </summary>
        Weeks = 6,

        /// <summary>
        /// Interval type is months.
        /// </summary>
        Months = 7,

        /// <summary>
        /// Interval type is years.
        /// </summary>
        Years = 8,

        /// <summary>
        /// Interval type is odd days
        /// </summary>
        OddDays = 9
    }
}

Чтобы новый член OddDays работал, я изменил класс DataTimeRangeAxis. Вот ссылка на pastebin, потому что программисты SO не обращают внимания на такую ​​мелочь, как ответы с длинными пояснениями.

Измените пространство имен SilverlightApplication3 на любое ваше (кроме System.Windows.Controls.DataVisualization.Charting).

Также я прокомментировал код последней функции, потому что он содержит много зависимостей, и я не хотел копировать дополнительные файлы в приложение. Ось без этого кода работает нормально, возможно, эта функция вообще не используется.

Самая важная часть класса находится в функции IncrementDateTime:

        //The interval type forced by a user, not actual interval type
        if (this.IntervalType == ExtendedDateTimeIntervalType.OddDays)
        {
            DateTime newDate;
            if(span != TimeSpan.Zero) //automatically created interval
                newDate = date.Add(span);
            else newDate = date.AddDays(interval); //else use the interval which is set by a user

            //find the nearest odd day
            while (newDate.Day % 2 != 1)
                newDate = newDate.AddDays(1);
            //update span
            span = newDate - date;
        }

Xaml будет выглядеть так:

        <charting:Chart.Axes>
            <local:DateTimeAxis IntervalType="OddDays" Orientation="X" Interval="1"/>
        </charting:Chart.Axes>

Вы можете установить Interval="2" вместо 1, но он пропустит день в наборе 31.01-1.02-3.02, поэтому лучше использовать значение 1.

person vortexwolf    schedule 07.03.2011
comment
Спасибо, vorrtex, я посмотрю на это решение, тогда, может быть, я потребую реализацию кастомной оси :) - person Germstorm; 14.03.2011
comment
@Germstorm Я отредактировал свой ответ. Ссылка на pastebin должна храниться вечно, чтобы вы могли собрать и скомпилировать все файлы. - person vortexwolf; 14.03.2011