繁体   English   中英

为什么进度栏不起作用?

[英]Why won't my progress bar work?

我无法让进度条正常工作。 任何帮助深表感谢!

这是代码:

<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();
    }
}

要添加Mark所说的话,有两种方法可以解决此问题。 破解方法和正确方法。

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

破解方法是在循环中调用Application.DoEvents。 我称其为hack,因为它只能部分起作用。 例如,如果您执行的是一个紧密循环,其中包含很多快速说明,那么它将正常工作。 如果执行的循环中您的指令需要一段时间,则此操作将不起作用(例如对数据库进行大型sql查询)。

是学习此特定示例的一个很好的链接。 我认为WPF处理的东西与常规WinForms略有不同。

这个答案并非特定于C#或WPF,而是针对Windows。 仅当您正在处理Windows消息时,进度条才会更新。 如果您正在运行紧密的CPU循环而没有UI交互,则进度条将永远没有机会重绘。

我不确定这是否是您的问题(我对动画了解不多...我只是通过增加“ Value”属性来使用进度条),但是我认为这里的大多数建议都忽略了用户界面WPF中引入的线程模型:WPF中的线程

如果您有某种循环(根据代码判断,我认为您没有,但是我可能是错的),那么您将需要使用Dispatcher调度循环的每次迭代...这样WPF可以散布您的代码,并执行需要正确重绘的UI事件。

希望这可以帮助。

我观察到两件事:

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

我假设您在问一个基本问题,就是要使用后面的代码来制作进度条? 我猜线程不是您的问题。 在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM