将WPF ProgressBar添加到C#控制台应用程序

时间:2017-09-20 20:20:07

标签: c# wpf windows-console

简而言之,由于业务需求的变化,我需要能够向最终用户展示由C#控制台应用程序控制的文件存档过程的进度。控制台应用程序基本上从数据库中获取本地文件列表,然后将它们复制到存档位置。这最初应该是由计划任务触发的后台进程。但是,现在,用户可以使用命令行中的各种参数手动启动它,因此我最近的任务是让用户知道归档过程的状态。

我认为我只会使用WPF ProgressBar控件,但现在我正在试图找出最好的方法来解决这个问题。我一直在使用@JamesWilkins的答案:WPF window from a Console project?

我已将ProgressBar窗口添加到控制台应用程序,并将以下内容添加到控制台中的Main方法(为简化起见,已超简化):

[STAThread]
static void Main(string[] args)
{

    // EXISTING CONSOLE LOGIC
    ParseCommandLineArgs();
    Configure();

    // ADDED
    InitializeWindows(); // opens the WPF window and waits here

    // EXISTING CONSOLE LOGIC 
    BeginArchival();        
}

static void InitializeWindows()
{
    WinApp = new Application();
    WinApp.Run(ProgressBar = new ProgressBar()); // blocking call
}

然后在ProgressBar.xaml代码后面:

public partial class ProgressBar : Window
{
    public ProgressBar()
    {
        InitializeComponent();
    }

    private void ProgressBar_OnContentRendered(object sender, EventArgs e)
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.DoWork += worker_DoWork;
        worker.ProgressChanged += worker_ProgressChanged;

        worker.RunWorkerAsync();
    }

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        // foreach file that is archived, report progress to the 
        // ProgressBar.
        for (int i = 0; i < 100; i++)
        {
            (sender as BackgroundWorker).ReportProgress(i);
        }
    }

    private void worker_ProgressChanged(object sender, 
        ProgressChangedEventArgs e)
    {
        PbArchiveStatus.Value = e.ProgressPercentage;
    }
}

进程在InitializeWindows()方法等待,直到进度条关闭,因此它不会触及我需要进度条显示进度的任何存档逻辑。看来我基本上需要将所有现有的控制台逻辑放在ProgressBar.worker_DoWork()方法中,但此时我的大脑开始受到伤害,所以我想我会伸手去拿。

我是在正确的轨道上,还是有更好的方法将基于GUI的进度条添加到控制台实用程序?让我知道我是否可以澄清任何事情。

0 个答案:

没有答案