Пример для набора 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.