Я написал простое приложение, отображающее текущее время (HH: MM). Отображаемое время обновляется каждую секунду DispatcherTimer.
Учитывая, что у меня есть файл конфигурации в формате XML, который содержит список часов, которые должны быть отображены в другом цвете в течение 5 минут:
Пример:
Но если есть "перекрывающиеся" возможности, например:
Затем время должно быть выделено с 8:15 до 08:17
Как бы вы реализовали свой код, который будет проверять текущее/фактическое время в пределах этих диапазонов?
Вы будете генерировать сначала список со всеми начальными + конечными временами для каждой записи и проверять фактическое время против этого списка каждую секунду? (зацикливание всех значений списка каждую секунду)? : -/
Или вы достигнете этого по-другому и как?
EDIT: Вот что сделано до сих пор:
private enum DisplayState
{
/// <summary>
/// The application has just been started or reset due to changes to the configuration file
/// </summary>
Initial,
/// <summary>
/// The current displayed time is highlighed
/// </summary>
Highlighted,
/// <summary>
/// The current displayed time is not highlighed
/// </summary>
Normal
};
DisplayState _lastDisplayState = DisplayState.Initial;
// The list that retrieves the hours from the XML file as string values ("HH:MM")
// Note: this can be changed into a list of TimeSpan or anything else in a near future
private List<string> _hourList;
private DispatcherTimer _dispatcherTimer;
...
/// <summary>
/// What happens each second
/// </summary>
private void dispatcherTimerTick(object sender, EventArgs e)
{
// Store current time
_timeToDisplay = DateTime.Now.ToString("HH:mm");
// Refresh displayed time
tbDigitalClock.Text = tbDigitalClockBack.Text = _timeToDisplay;
PlaceWindow();
// Check if our list of hours contain current time
// Note: for the moment _hourList is a list of strings (hours from the XML file)
if (_hourList.Contains(_timeToDisplay))
{
// Only change appearance once if display state changed
if (_lastDisplayState != DisplayState.Highlighted)
{
_lastDisplayState = DisplayState.Highlighted;
// Play sound alert if desired
if (_playSound)
_soundPlayer.Play();
// Highlight current displayed time
tbDigitalClock.Foreground = Brushes.Yellow;
tbDigitalClockBack.Foreground = Brushes.Black;
mainBorder.Background = _highlightedBackColor;
mainBorder.BorderBrush = Brushes.Red;
}
}
else
{
if (_lastDisplayState != DisplayState.Normal)
{
_lastDisplayState = DisplayState.Normal;
// Turn displayed time appearance back to normal
tbDigitalClock.Foreground = _defaultTextColor;
tbDigitalClockBack.Foreground = _defaultTextBackColor;
mainBorder.Background = Brushes.Transparent;
mainBorder.BorderBrush = Brushes.Transparent;
}
}
}
Файл XML выглядит так:
<DigiClock>
<Config PlaySound="true" />
<Breaks>
<Time>10:00</Time>
<Time>12:00</Time>
<Time>14:30</Time>
<Time>16:30</Time>
</Breaks>
</DigiClock>
Спасибо заранее! ;-)
Как представляется, вы кодируете приложение GUI, я бы пошел с таймером с интервалом, установленным в 1 секунду (или, может быть, 5 секунд достаточно или что-то промежуточным?) И с обработчиком событий, подобным этому (непроверенным):
TimeSpan t = new TimeSpan(0, 5, 0); // five minutes
List<DateTime> _hourList;
bool _soundPlayed = false;
private void OnTimerTick()
{
DateTime now = DateTime.Now;
foreach (var h in _hourList)
{
if ((now >= h) && (now <= (h + t)))
{
if (_lastDisplayState != DisplayState.Highlighted)
{
_lastDisplayState = DisplayState.Highlighted;
...
}
if (!_soundPlayed)
{
_soundPlayed = true;
_soundPlayer.Play();
}
return;
}
}
// if code runs until here, we are out of any highlighted moment
_soundPlayed = false;
if (_lastDisplayState != DisplayState.Normal)
{
_lastDisplayState = DisplayState.Normal;
...
}
}