为什么我的进度条不起作用?

时间:2009-07-13 19:30:04

标签: c# wpf progress-bar

我无法让我的进度条工作。非常感谢任何帮助!

以下是代码:

<Window x:Class="BulkSAConfigureControl.BulkSaProgressBar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Please Wait.." Height="60" Width="300" WindowStyle="ToolWindow" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
<ProgressBar Name="progressBar" IsIndeterminate="True">
    <ProgressBar.Resources>
        <ResourceDictionary Source="/PresentationFramework.Aero;v3.0.0.0;31bf3856ad364e35;component/themes/aero.normalcolor.xaml" />
    </ProgressBar.Resources>
</ProgressBar>

public class ProgressBarClass : Window
{   
    public ProgressBarClass()
    {
        InitializeComponent();
    }

    public void StartProgressBar()
    {
        Duration d = new Duration(TimeSpan.FromSeconds(5));
        DoubleAnimation anim = new DoubleAnimation(100.0, d);
        progressBar.BeginAnimation(ProgressBar.ValueProperty, anim);
        this.Show();
    }

    public void StopProgressBar()
    {
        this.Close();
    }
}

public class DoSomething : UserControl
{
    public void DoSomeStuff()
    {
        ProgressBarClass pBar = new ProgressBarClass();
        pBar.StartProgressBar();

        // Do some stuff here

        pBar.StopProgressBar();
    }
}

5 个答案:

答案 0 :(得分:3)

要添加Mark所说的内容,有两种方法可以解决问题。黑客的方式和正确的方式。

正确的方法是使用线程,例如BackgroundWorker。您最终可能会使用control.BeginInvoke来处理更新GUI线程。

黑客方法是在循环中调用Application.DoEvents。我称之为黑客,因为它只是部分有效。例如,如果你正在进行一个有很多快速指令的紧密循环,那么它将很好地工作。如果你正在做一个循环,你的指令需要一段时间,这将无法工作(例如对数据库进行大量的SQL查询)。

Here是了解这个特定示例的好链接。我认为WPF只处理与常规WinForms略有不同的东西。

答案 1 :(得分:1)

这个答案并非针对C#或WPF,而是针对Windows。只有在处理Windows消息时,才会更新进度条。如果您在没有UI交互的情况下运行紧凑的CPU循环,则进度条永远不会重新绘制。

答案 2 :(得分:1)

我不确定这是你的问题(我对动画知之甚少......我只是通过增加“价值”属性来使用进度条),但我认为这里的大部分建议都是忽略WPF中引入的UI线程模型:Threading in WPF

如果你有某种循环(我不认为你这样做,从你的代码判断,但我可能是错的),那么你会想要用Dispatcher计划循环的每次迭代......通过这种方式,WPF可以将执行的代码与正确重新绘制所需的UI事件进行散布。

希望这有帮助。

答案 3 :(得分:1)

我发现了两件事:

  • 如果您为进度条设置IsIndeterminate =“True”,它将不会从0到100%步行但只是一次又一次地左右运行(一些KITT效果),只有当你不穿时才会想要这个不知道,你在进度时间表中的位置。 (某些样式你甚至在进度条上看不到任何东西,但在Vista-default上它显示出一些从一边到另一边的绿色阴影)
  • 如果要从后台线程设置进度值,则应通过使用后台工作程序执行此操作,然后在某些里程碑后使用名为“ReportProgress”的方法。这样,UI将执行更新以显示您的新进度。

答案 4 :(得分:0)

我假设你问一个基本问题,即使用后面的代码使进度条工作?我猜,线程不是你的问题。 在WPF中使进度条工作非常简单。希望你的背景过程中会有一些价值观或百分比。只需设置ProgressBar.Value属性,它将完成剩下的工作。

下面的测试应用程序
<ProgressBar x:Name="progress" MouseDown="Window_MouseDown" VerticalAlignment="Top" Height="93"/>

在C#

    private void Window_MouseDown(object sender, MouseButtonEventArgs e)
    {
        progress.Value = progress.Value+1;
    }

在后面的代码中编写以下代码,并在应用程序运行时继续单击ProgressBar