c#WinForm字幕进度条不滚动

c#WinForm字幕进度条不滚动,c#,.net,winforms,progress-bar,C#,.net,Winforms,Progress Bar,背景: 我有一个VB6应用程序,它当前在数据库中进行一些处理,然后调用一个COM公开的c#类。然后,c#类在后台工作程序上执行其他一些长时间处理。在此期间,我会弹出一个状态窗口,其中有一个状态标签和一个进度条。我希望进度条以字幕样式显示,但它不会设置动画。它是可见的,功能正常,但仅作为块样式。我可以设置该值,它将显示块样式,但当我将样式设置为marquee时,它什么也不做。是VB6应用程序杀死了它吗?如何使动画正确显示 我所做的: 我已确保设置Application.EnableVisualS

背景:

我有一个VB6应用程序,它当前在数据库中进行一些处理,然后调用一个COM公开的c#类。然后,c#类在后台工作程序上执行其他一些长时间处理。在此期间,我会弹出一个状态窗口,其中有一个状态标签和一个进度条。我希望进度条以字幕样式显示,但它不会设置动画。它是可见的,功能正常,但仅作为块样式。我可以设置该值,它将显示块样式,但当我将样式设置为marquee时,它什么也不做。是VB6应用程序杀死了它吗?如何使动画正确显示

我所做的:

  • 我已确保设置Application.EnableVisualStyles();(我试过了 在不同的地方设置!)

  • 我已经通过编程设置了标记样式,甚至验证了 调试时设置样式

  • 我已尝试调用ProgressBar.Show();即使它已经 在表单上可见

  • 我尝试使用静态和非静态(显示在下面)助手类

下面是我创建的、使用的小助手类

internal class EStatusHelper
{
    private EStatus status = null;

    public void ShowStatusForm<T>(Action<T> process, T arguments)
    {
        var bg = new BackgroundWorker();

        bg.WorkerReportsProgress = true;

        using (status = new EStatus(bg.RunWorkerAsync))
        {
            bg.DoWork += (o, args) =>
            {
                process(arguments);
            };

            bg.RunWorkerCompleted += (o, args) =>
            {
                status.DialogResult = DialogResult.Cancel;
            };

            status.ShowDialog();
        }
    }

    public void UpdateStatusMessage(
        string message)
    {
        if (status != null)
        {
            if (status.StatusMessage.InvokeRequired)
            {
                try
                {
                    status.StatusMessage.Invoke(
                        new Action<string>(UpdateStatusMessage),
                        message);
                }
                catch { }
            }
            else
            {
                status.StatusMessage.Text = message;
            }
        }
    }
}
下面是使用helper函数的基本调用

// helper variable that can be passed around.
// Also tried Static methods instead of passing around a local variable.
var helper = new EStatusHelper();
helper.ShowStatusForm(MethodToInvoke, paramsToPass);

谢谢大家!

重要的代码丢失了。没有必要使用不显示状态的“状态”表单。这样做太频繁会导致UI线程紧张,并停止移动字幕。像那样调用Application.EnableVisualStyles()是非常致命的。@HansPassant UI不会冻结。表单显示得很好,使用与UpdateStatusMessage()方法相同的技术可以很好地更新进度对话框。但它只能更新为“块”样式的进度条。它将不会显示为字幕样式。请参阅更新的代码。根据windows文档:字幕样式仅在以下平台上受支持:windows XP Home Edition、windows XP Professional x64 Edition、windows Server 2003。您是否在其中任何一台计算机上运行应用程序?@alstonp我正在Windows 7、Windows 8和Windows XP Pro x64计算机上运行应用程序,结果相同。仅供参考。制作一个简单的Windows窗体应用程序,在Windows 7或8中只添加一个样式设置为Marquee的进度条,然后点击Run。它会滚动一整天。@HansPassant“Application.EnableVisualStyles()像那样是非常致命的”-我已经在许多不同的地方尝试过这一点,包括启动整个过程的COM公开类的推荐位置->构造函数。它在任何地方都没有对此事产生任何不良影响或良好影响。我已经阅读了MSDN关于这一点的说明,它应该在创建任何控件之前调用。上面的例子只是众多例子中的一个,恰好是它在发布时的位置。如果您能为我指出正确的方向,我将不胜感激。
// helper variable that can be passed around.
// Also tried Static methods instead of passing around a local variable.
var helper = new EStatusHelper();
helper.ShowStatusForm(MethodToInvoke, paramsToPass);