繁体   English   中英

如何减少气球数量

[英]How to reduce the number of Balloon

我有一个目录和一个FileSystemWatcher,我想减少Balloon.Show的数量,每次删除文件时该怎么办? 因为每次我删除20个文件时,explorer.exe崩溃都会导致ShowBalloonTips过多。 如果在我的论坛中找到一种解决方案,该解决方案可以有效,如果我一个接一个地删除文件,但是如果我将所有文件全部删除,它就会出错,并且不再触发OnDelete ...有什么建议吗?

private void InitializeWatcher()
{
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                           | NotifyFilters.FileName | NotifyFilters.DirectoryName;
    watcher.Filter = "*.*";
    watcher.Changed += new FileSystemEventHandler(OnChanged);
    watcher.Created += new FileSystemEventHandler(OnCreated);
    watcher.Deleted += new FileSystemEventHandler(OnDeleted);
    watcher.Renamed += new RenamedEventHandler(OnRenamed);
    watcher.EnableRaisingEvents = true;
}

private void OnDeleted(object sender, FileSystemEventArgs e)
{
    SetBalloonTip("File Eliminato");
    notifyIcon1.ShowBalloonTip(1);

    ((FileSystemWatcher)sender).Deleted -= new FileSystemEventHandler(OnDeleted);
    timerRepeat.Interval = 500;
    timerRepeat.Elapsed += new ElapsedEventHandler(t_Elapsed);
    timerRepeat.Start();
    } 

  void t_Elapsed(object sender, ElapsedEventArgs e)
    {
        ((System.Timers.Timer)sender).Stop();
    }

这不是最有效的方法,但是我可能会保留删除的文件数并每隔n次显示工具提示,例如

private int deleteCounter = 0;

private void OnDeleted(object sender, FileSystemEventArgs e)
{
    //your delete code
    if(deleteCounter % 50 == 0)
    {
        SetBalloonTip("File Eliminato");
        notifyIcon1.ShowBalloonTip(1);
    }
}

在显示通知之前,最好稍等片刻,以免将太多通知推送到资源管理器上。

最好的方法是使用计时器将通知延迟500毫秒。 在此期间,您可以通过一个简单的计数器跟踪删除了多少文件。 计时器打勾后,您将显示通知,并显示到目前为止已删除的文件数。 您重置计数器,然后等待通知消失。 然后,您又回到了初始状态,该过程可以重新开始。

以上方案的实现可能如下所示:

int pendingDeletes = 0;
int TipState = 0; // keeps the state of the notifyIcon, 
                  // 0 = initial,
                  // 1 is about to be shown
                  // above 1 is waiting to reset to 0

private void OnDeleted(object sender, FileSystemEventArgs e)
{
    pendingDeletes++;
    if (TipState == 0)
    {
        TipState++; 
        // it didn't want to start http://stackoverflow.com/a/18348878
        this.Invoke( new MethodInvoker( () => timer1.Start()));
    }

}

// tick every 500 ms
private void timer1_Tick(object sender, EventArgs e)
{
    Trace.WriteLine(TipState);
    switch(TipState)
    { 
        case 1:
            notifyIcon1.BalloonTipText = String.Format("{0} deleted file(s)", pendingDeletes);
            notifyIcon1.ShowBalloonTip(500);
            pendingDeletes = 0;
            TipState++;
            break;
        case 2:
            // do nothing
            TipState++;
            break;
        case 3:
            // maybe do something if pendingDeletes > 0
            timer1.Stop();
            // back to initial state
            TipState = 0;
            break;
        default:
            // prevent mishaps
            TipState = 0;
            break;
    }
}

我找不到一种可靠的方法来检测通知是否已经消失,因此在重新设置为初始状态之前需要等待额外的等待状态。 如果您的用户真正关心的是已删除文件的确切数量,那么您可能希望根据报告的已删除文件的数量来加强内务管理。 我将其作为练习。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM