【问题标题】:Updating a 2nd window control from events in an object created in the 1st window根据在第一个窗口中创建的对象中的事件更新第二个窗口控件
【发布时间】:2010-09-05 14:04:34
【问题描述】:

这是我需要的(有点难以解释):

我有 2 个窗口控件: MainWindow 和 FileMover 和 1 个实用程序类: 文件监视器

MainWindow 创建了一个新的 FileMonitor 对象,用于测试它的 Loaded 事件,该事件创建一个 FileSystemWatcher 和一个 Timer 对象。 FileSystemWatcher 监视给定文件夹的 Created 和 Changed 事件,并将 Timer 添加为某种事件缓冲区(例如,将文件夹或大文件复制到正在监视的文件夹时,这会生成几个事件。我只想对第一个事件,而不是其余的)。这意味着,直到计时器停止并生成其 Elapsed 事件才创建 FileMover 窗口。这个窗口有一些基本的文件/文件夹复制/移动逻辑和一个显示当前状态的 ProgressBar 控件。

我的问题是: ProgressBar 控件在文件处理期间不会更新。只有当复制/移动方法返回时,进度条才会更新。 我已经尝试使用 FileMover 的调度程序和 ProgressBar 调度程序,但这些都不起作用。

如果我上面的内容很不清楚,请告诉我! 这是我的来源:

来源: http://pastie.org/1139570

(由于站点限制,必须将两个源文件都粘贴到 1 个中。)

【问题讨论】:

    标签: c# .net wpf multithreading dispatcher


    【解决方案1】:

    您必须在另一个线程中加载文件。如果没有,则不会刷新 UI。一个简单的方法是BackgroundWorker-class。这是一个简短的例子:

    BackgroundWorker bgWorker = new BackgroundWorker() { WorkerReportsProgress=true};
    bgWorker.DoWork += (s, e) => {
        // Load here your file/s
        // Use bgWorker.ReportProgress(); to report the current progress
    };
    bgWorker.ProgressChanged+=(s,e)=>{
        // Here you will be informed about progress 
        //  (if bgWorker.ReportProgress() was called in DoWork)
    };
    bgWorker.RunWorkerCompleted += (s, e) => {
        // Here you will be informed if the job is done
    };
    bgWorker.RunWorkerAsync(); 
    

    【讨论】:

    • 非常感谢 - 在我的挫折中我忘记了锁定 UI 的所有方法 -.-
    猜你喜欢
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2018-12-06
    相关资源
    最近更新 更多