在Silverlight中的一个简单的Microsoft图表控件中,我将一个月的日期作为X轴上的日期和Y轴上的双倍值。我想在X轴上每隔一天显示一次,但那些日子应该是奇数天。
如果我设置IntervalType =“Days”和Interval =“2”,编号总是从第2天开始。即使我在前面或末尾或两者都放了一个虚拟日期。
而不是: __ 02 __ 04 __ 06 __ 08 __ 10 ...
我需要: 01 __ 03 __ 05 __ 07 ...
如何以最简单的方式实现这一目标?
答案 0 :(得分:2)
集合31.01 -> 1.02 -> 3.02
而不是31.01 -> 2.02
的示例。在这种情况下,唯一的方法是编写与Axis
类似的自定义DateTimeAxis
。
首先将以下文件复制到您的项目中:
使用完全相同的命名空间复制这些文件,它们是内部的,因此不存在名称冲突。
接下来,添加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
。 Here is a link on 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.