【问题标题】:Dynamic Data Display Scattered DateTime Axis动态数据显示分散的日期时间轴
【发布时间】:2012-10-17 14:54:15
【问题描述】:

我正在尝试为股票价格图表绘制烛台标记。我在交易日的每一分钟都有一个标记 - 上午 9:30 到下午 4:00。我不想显示每个交易日下午 4:01 到上午 9:29 的空白区域。有没有办法可以从图表上的 X 轴中删除该时间跨度?我希望所有数据看起来连续而不会中断。我将 NumericAxis 与我创建的 TickToDateTimeLabelProvider 一起用于我的 X 轴。有没有办法改变 LabelProvider 以满足我的需要?还是比这更深?

这是我的 LabelProvider 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;

namespace Microsoft.Research.DynamicDataDisplay.Charts {
public class TickToDateTimeLabelProvider : NumericLabelProviderBase {
    public override UIElement[] CreateLabels(ITicksInfo<double> ticksInfo) {
        var res = new TextBlock[ticksInfo.Ticks.Length];
        for (int i = 0; i < ticksInfo.Ticks.Length; ++i) {
            long l = (long)ticksInfo.Ticks[i];
            if (l < 0)
                l = 0;
            DateTime dt = new DateTime(l);
            res[i] = new TextBlock();
            res[i].Text = dt.ToString();
        }
        return res;
    }
}
}

【问题讨论】:

    标签: c# wpf datetime dynamic-data-display


    【解决方案1】:

    解决了这个问题,我最终使我的 X 映射数据在集合中的位置,然后创建一个新的标签提供程序来将位置更改为我想要的 DateTimes。我的新标签提供程序如下所示:

    using System;
    using System.ComponentModel;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using Microsoft.Research.DynamicDataDisplay.Charts.Axes;
    using System.Globalization;
    
    
    namespace Microsoft.Research.DynamicDataDisplay.Charts {
    
    public class TradingLabelProvider : NumericLabelProviderBase {
    
        private List<DateTime> m_Labels;
        public List<DateTime> Labels {
            get { return m_Labels; }
            set { m_Labels = value; }
        }
    
        public TradingLabelProvider(DateTime start, List<DateTime> labels) {                                    
            Labels = labels;                                    
        }
    
        public override UIElement[] CreateLabels(ITicksInfo<double> ticksInfo) {            
    
            var ticks = ticksInfo.Ticks;
            Init(ticks);            
    
            UIElement[] res = new UIElement[ticks.Length];
            LabelTickInfo<double> tickInfo = new LabelTickInfo<double> { Info = ticksInfo.Info };
            for (int i = 0; i < res.Length; i++) {
                tickInfo.Tick = ticks[i];
                tickInfo.Index = i;
                string labelText = "";
    
                if(Convert.ToInt32(tickInfo.Tick) <= Labels.Count && tickInfo.Tick >= 0) {
                    labelText = Labels[Convert.ToInt32(tickInfo.Tick)].ToString();
                }
    
                TextBlock label = (TextBlock)GetResourceFromPool();
                if (label == null) {
                    label = new TextBlock();
                }
    
                label.Text = labelText;
                label.ToolTip = ticks[i].ToString();
    
                res[i] = label;
    
                ApplyCustomView(tickInfo, label);
            }
            return res;
        }
    }
    }
    

    这让我可以将这些日子串在一起,它们之间没有空格来满足我的要求。我努力尝试使用 DateTimeAxis 来做到这一点,但无济于事。

    【讨论】:

    • 请举例说明如何使用这个类?特别是我无法处理 CreateLabels 方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多