更新ShowDialog()窗口

时间:2011-03-27 00:16:52

标签: wpf

我有一个应用程序在运行时发布进度/状态消息(它是数据库模式更新程序)。因为它可以在有或没有UI的情况下运行,所以这些消息必须转到Console或简单的WPF窗口。 WPF窗口以模态方式打开。它包含的所有内容都是邮件发布到的列表框。

为了处理线程问题(GUI必须在STA线程上,而Console不在),我使用以下逻辑:

if( args.NoUI )
{
    // we're just doing plain old console-based logging
    frame = new nHydrateInstallationFrame(installer) { ReportingThreshold = threshold };

    frame.Execute();
}
else
{
    // GUI has to be on an STA thread, so wrap ourselves and go!
    frame = new nHydrateUIInstallationFrame(installer) { ReportingThreshold = threshold };
    // the Execute method on an nHydrateUIInstallationFrame object calls ShowDialog().
    // when the resulting window opens, the actual installation process begins to execute.
    // this allows UI-based logging, and, more importantly, keeps the logging window open
    // until the user explicitly closes it after the installation process completes. If 
    // we don't do this kind of indirect execution, the logging window will immediately close
    // after the installation method ends, which will keep the user from reviewing the
    // logging output
    Thread staThread = new Thread(frame.Execute);
    staThread.SetApartmentState(ApartmentState.STA);
    staThread.Start();
    staThread.Join();
}

这只是一个摘录,但它显示了这种方法,我认为(即,为UI创建一个单独的线程,设置其公寓状态,启动它并加入它)。这会导致帧上的Execute方法(包含输出“sink”的对象)运行。 Execute方法调用实际的数据库模式修改例程,将其自身作为参数传递。模式修改例程将消息写入帧,然后将其输出到控制台或UI。

这一切都很好......除了发布到UI窗口的消息在UI运行完成后才显示。如果您使用鼠标展开UI消息窗口,我应该添加。在这种情况下,消息会在发布时显示。

这让我觉得我有一些焦点问题,除非我玩它,否则UI窗口没有焦点。但我不确定。我确实尝试在创建后立即将焦点设置到UI窗口,但这没有做任何事情。

我很感激如何将消息发布到UI窗口以实时显示。

1 个答案:

答案 0 :(得分:1)

我怀疑你在UI线程上运行数据库升级。在这种情况下,在后台线程上运行升级例程,并从那里将yor消息发布到窗口。您可能希望为此目的查看BackgroundWorker类。