使弹出等待再次显示

本文关键字:显示 等待 | 更新日期: 2023-09-27 18:13:56

我有一个弹出在我的应用程序显示消息。有时,两条信息一个接一个地显示得太快,第二条信息覆盖了第一条信息,使它消失得太快。

所以我想要的是下一条消息等待前一条消息关闭。我使用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) {}

应用程序只是挂在里面,而IsOpen永远不会变回False,即使在等待5秒计时器用完之后。除此之外,我不喜欢使用像这样的阻塞while-loop。

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

使弹出等待再次显示

快速破解:

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(...);
}