0

在 Silverlight 中的一个简单的 Microsoft 图表控件中,我将一个月的天数作为 X 轴上的日期和 Y 轴上的双精度值。我想在 X 轴上每隔一天显示一次,但那些日子应该是奇数天

如果我设置 IntervalType="Days" 和 Interval="2" 编号总是从第 2 天开始。即使我在前面或最后或两者都放了一个虚拟日期。

而不是: __ 02 __ 04 __ 06 __ 08 __ 10 ...

我需要:01 __ 03 __ 05 __ 07 ...

我怎样才能以最简单的方式实现这一目标?

4

1 回答 1

2

集合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,但它会跳过 set 中的一天31.01-1.02-3.02,因此最好使用值 1。

于 2011-03-07T18:24:08.893 回答