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