0

我的应用程序中有一个用于显示消息的弹出窗口。有时,两条消息一个接一个显示得太快,而第二条则覆盖了第一条,使其消失得太快。

所以我想要的是下一条消息等待上一条消息关闭。我同时使用 aDispatcherTimer和 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();
        });

现在,如果我将以下循环放在显示委托中

 while(popupMessage.IsOpen) {}

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

有什么办法可以让我的消息互相等待吗?我尝试使用简单的布尔值而不是 PopupMessage 的 IsOpen,但无济于事。

4

1 回答 1

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(...);
}
于 2013-05-17T08:38:51.917 回答