弹出窗口等待再次显示

时间:2013-05-17 06:23:57

标签: c# .net wpf dispatcher

我的应用程序中有一个用于显示消息的弹出窗口。 有时,两条消息相互之后显示得太快,第二条消息会覆盖第一条消息,使其消失得太快。

所以我想要的是下一条消息等待上一条消息关闭。 我正在使用DispatcherTimer和MouseEvent来关闭弹出窗口:

popupTimer.Interval = TimeSpan.FromSeconds(5d);
popupTimer.Tick += (sender, args) =>
    { 
        popupMessage.IsOpen = false; 
        popupTimer.Stop();
    };
popupMessage.MouseDown += (sender, args) =>
    {
        popupMessage.IsOpen = false;
        popupTimer.Stop();
    };

显示消息的方式如下:

popupMessage.Dispatcher.Invoke(
    () =>
        {
            popupMessage.IsOpen = true;
            popupTimer.Start();
        });

现在,如果我将以下循环放在show delegate

 while(popupMessage.IsOpen) {}

即使在等待5秒钟以后计时器耗尽,应用程序也会挂起,而IsOpen永远不会变回False。除此之外,我不喜欢像这样使用阻塞的while循环。

有没有办法让我的消息互相等待?我尝试使用一个简单的bool而不是PopupMessage的IsOpen,但无济于事。

1 个答案:

答案 0 :(得分:1)

快速入侵:

while(popupMessage.IsOpen)
{
    System.Threading.Thread.Sleep(0);
}

最好的事情可能是从队列中提取消息

Queue<...> messages = new Queue<...>();

...

popupTimer.Tick += (sender, args) =>
{
    if (messages.Count > 0) 
    {
        ... = messages.Dequeue();
    }
    else 
    {
        popupMessage.IsOpen = false;
        popupTimer.Stop();
    }
};

并在邮件打开时对其进行排队。

if (popupMessage.IsOpen) {
    messages.Enqueue(...);
}