[英]Have MessageBox appear once (code inside timer)
更新:我已經設法解決了我的問題。 使用下面的代碼,在保存XML之后移動了MessageBox,並將Timer從100ms更改為400ms。 我現在有1個盒子出現,感謝上帝。 盡管如果有人在更新列表數組(ActListTask)中的單個值(ActReminded)方面有捷徑,那真是太好了。
我在顯示MessageBox時遇到了一些問題。 在計時器內部顯示,不會向我發送垃圾郵件。 這是我一直在使用的代碼部分:
public class ActiveTasks
{
//Properties here
}
public List<ActiveTasks> ActTaskList = new List<ActiveTasks>();
for (int i = 0; i < ListActive.Items.Count; i++)
{
if (DTime.Date == newDateTime.Date)
{
if (newDateTimeLeft.CompareTo(TimeSpan.Zero) <= 0 && ActTaskList[i].ActReminded != "true")
{
MessageBox.Show("!!!!");
ActTaskList.Add(new ActiveTasks()
{
ActTitle = ActTaskList[i].ActTitle,
ActDesc = ActTaskList[i].ActDesc,
ActDate = ActTaskList[i].ActDate,
ActTime = ActTaskList[i].ActTime,
ActStatus = ActTaskList[i].ActStatus,
ActReminded = "true",
ActRepeat = ActTaskList[i].ActRepeat
});
ListActive.Items.RemoveAt(i);
ActTaskList.RemoveAt(i);
XDocument XmlActTasks = GenerateActiveListToXML(ActTaskList);
}
}
}
實際上,我決定不管顯示是否顯示,都希望保留提醒狀態,因為我不想每次打開程序時都重復提醒。 由於我不知道一種更新ActTaskList單個部分的方法,因此我只是重新添加了它,然后刪除了原來的部分。 該代碼設法識別出,如果發生,它將提醒狀態從false更改為true; 確定所有垃圾郵件之后。 因此,一旦我設法關閉所有消息框,它將停止消息框。 但是,它不會阻止垃圾郵件。 我將計時器設置為100毫秒與這有什么關系嗎? 還是它們可以成為使消息框不出現在計時器內的另一種方式?
當前時間精確到秒的幾率很小。 為什么不將newDateTime視為截止點並僅設置標志?
//Declare this outside of the loop
bool hasDisplayed = false;
//Inside the timer event handler
if (!hasDisplayed && DateTime.Now >= newDateTime)
{
hasDisplayed = true;
MessageBox.Show("!!!!!!!!!!!!!");
}
你可以做這樣的事情嗎?
Action message = () => MessageBox.Show("!!!!!!!!!!!!!"));
object lockOb = new object();
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
lock(lockOb)
if(null != message)
{
message();
message = null;
}
}
您說您已經嘗試過一個布爾值,指示消息已經顯示,我認為是因為代碼可能看起來像下面那樣。
void TimerLoop()
{
bool msgAlreadyShown;
if(!msgAlreadyShown)
{
MessageBox.Show("!!!!!!!");
}
// Other work in your timer function
}
該代碼的問題在於,每次計時器調用函數時,布爾值都將設置為false。 您沒有發布太多代碼,但是至少已經說明了要完成的工作,這是一個計時器,用於檢查是否應向用戶顯示提醒。
我將對您如何組合軟件進行一些大膽的猜測,很有可能它已經走了,但是我希望它可以為您指明正確的方向。 您可能會有這樣的提醒類:
public class Reminder
{
string Message { get; set;}
DateTime Alarm { get; set; }
bool IsDismissed { get; set; }
}
我假設您可能想在計時器循環中檢查多個提醒,因此您的計時器循環可能類似於:
private List<Reminder> _activeReminders; // A list of reminders
void TimerLoop(object s, ElapsedEventArgs e)
{
lock(_activeReminders)
{
var now = DateTime.Now;
foreach(var reminder in _activeReminders)
{
// only run this code if the time has passed and it hasn't already
// been shown
if(now.CompareTo(reminder.Alarm) >= 0 && !reminder.IsDismissed)
{
MessageBox.Show(reminder.Message);
reminder.IsDismissed = true;
}
}
}
}
這是一個非常幼稚的實現,因為您可能不想永遠保留提醒,並且這些提醒永遠不會從_activeReminders
列表中刪除,但是您基本上只需要添加某種狀態來確定提醒是否已經存在被顯示。
當然,這也不是一個完整的示例,因為我從未新建_activeReminders
字段或在其中添加任何內容,但是我認為這可能有助於您了解需要做的事情。 另外,您可能不關心多個提醒,並且您的計時器代碼可能看起來像這樣。 主要思想是向您展示如何跟蹤提醒的狀態,並將其定制為自己的代碼。 以上僅是示例。
另外,我還沒有真正測試過它,因此將它像偽代碼一樣對待。 但是,邏輯是合理的,應該只使消息框出現一次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.