我正在使用GMAP.NET编写车辆跟踪应用程序
我希望根据日期/时间显示多个车辆标记的同时移动。
为此,我想使用一个轨迹栏,以便当用户滑动轨迹栏时,会显示多个标记的相应移动。
我在浏览器上执行了相同的应用程序,但效果非常好。我将marker标记的datetime属性转换为UNIX时间戳,然后将轨迹栏(NOUI Slider)值设置为UNIX时间戳范围。
但是,现在我发现使用Windows桌面C#Trackbar完全无法做到这一点。
问题是:
跟踪栏无法获取非常大的时间戳值。例如。 5年的数据。
即使减少了非常大的数字,轨道栏仍然无法获得如此高的值并且保持滞后或崩溃。
EG。我需要显示5年的数据。在这种情况下,我的轨迹栏将具有最小值 - 1262304000(即01-01-2010)至1425203100(即01-03-2015 | 09:45)。
但是这样的大值不适用于我的轨迹栏。
我甚至减少了,例如。将1262304000设置为1,然后将162899100(即1425203100 - 1262304000)设置为我的最大值。
但即使这是非常密集的,跟踪栏也不起作用。
请建议是否有时间轨道栏可以显示非常大的日期时间范围,或者我如何使用具有非常大值的常规轨道栏。
代码如下 -
一个。将datetime转换为UNIX时间戳的函数
public Int32 UnixTimeStampUTC(DateTime datetime)
{
Int32 unixTimeStamp;
DateTime zuluTime = datetime.ToUniversalTime();
DateTime unixEpoch = new DateTime(1970, 1, 1).ToUniversalTime();
unixTimeStamp = (Int32)(zuluTime.Subtract(unixEpoch)).TotalSeconds;
return unixTimeStamp;
}
B中。通过连接日期和数据从DataTable获取DateTime时间列和添加第三列以保存DateTime列的Unix TimeStamp
for (int z = 0; z < dt.Rows.Count; z++)
{
if (reviseddt.Rows[z]["date"].ToString() != "")
{
dte = DateTime.Parse(reviseddt.Rows[z]["date"].ToString());
dteticks = UnixTimeStampUTC(dte);
}
else
{
dteticks = 0;
}
if (reviseddt.Rows[z]["time"].ToString() != "")
{
tm = DateTime.Parse(reviseddt.Rows[z]["time"].ToString());
tmticks = UnixTimeStampUTC(tm);
}
else
{
tmticks = 0;
}
Int32 fullDt = dteticks + tmticks;
reviseddt.Rows[z]["datetime"] = fullDt.ToString();
reviseddt.Rows[z]["datetimestring"] = reviseddt.Rows[z]["date"].ToString() + reviseddt.Rows[z]["time"].ToString();
℃。通过获取数据表中datetime列的最小值和最大值,然后将范围作为最小值和最大值之间的差值来使轨迹栏初始化。因此,Trackbar范围= 1到(Max-Min)
string strminlevel = toplotDataTable.Compute("min(datetime)", String.Empty).ToString();
string strmaxLevel = toplotDataTable.Compute("max(datetime)", String.Empty).ToString();
Int32 minLevel = Convert.ToInt32(strminlevel);
Int32 maxLevel = Convert.ToInt32(strmaxLevel);
Int32 rangeint = maxLevel - minLevel;
trackBarMoveTarget.Maximum = rangeint;
trackBarMoveTarget.Minimum = 1;
trackBarMoveTarget.LargeChange = 100;
trackBarMoveTarget.SmallChange = 1;
答案 0 :(得分:0)
在这种规模下使用TrackBar
存在两个问题。
首先,你需要能够左右移动轨迹栏,但如果SmallChange
和LargeChange
属性太小,那么你可能会取得很大进展,但它根本就没有在赛道栏上显示。试试这个:
trackBarMoveTarget.Maximum = rangeint;
trackBarMoveTarget.Minimum = 1;
trackBarMoveTarget.LargeChange = rangeint / 50;
trackBarMoveTarget.SmallChange = rangeint / 200;
另一个问题是TrackBar
控件试图沿其长度呈现有用的小刻度线。默认情况下,TickFrequency
为1
,Maximum
值为10
。当您将Maximum
设置为162899100
而不更改TickFrequency
时,不良TrackBar
控件必须尝试渲染162899100
刻度标记,这需要很长时间。试试这个:
trackBarMoveTarget.TickFrequency = rangeint / 100;
答案 1 :(得分:-1)
逼真 - 轨迹栏的分辨率只有1像素 - 大多数显示器的宽度最多为1920像素。因此,分辨率必须是1920年 - 让它一直到2000年。
现在你有一个5年的时间= 5 * 365 + 1(对于奇数闰年)= 1826.这几乎等于我们原来的2000多数。所以,让它成为1826年。
因此,将最小值设置为0,将最大值设置为1826。
当您收到赛道事件时,您将获取第一个日期01-01-2010并将轨道栏的值添加到其中:
var firstDate = new DateTime(2010, 1, 1).Date;
var trackDate = firstDate + TimeSpan.FromDays(trackBar.Value);
简单快捷。