2

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

这是代码:

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

5 回答 5

3

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

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

hack 方法是在循环中调用 Application.DoEvents。我称其为 hack,因为它仅部分有效。例如,如果你正在做一个有很多小快速指令的紧密循环,那么它会很好地工作。如果您正在执行指令需要一段时间的循环,这将不起作用(例如对数据库进行巨大的 sql 查询)。

是了解此特定示例的好链接。我认为 WPF 处理的事情与常规 WinForms 略有不同。

于 2009-07-13T19:57:57.017 回答
1

此答案并非特定于 C# 或 WPF,而是一般适用于 Windows。仅当您正在处理 Windows 消息时,进度条才会更新。如果您在没有 UI 交互的情况下运行紧密的 CPU 循环,则进度条永远没有机会重新绘制。

于 2009-07-13T19:39:52.403 回答
1

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

如果您有某种循环(从您的代码来看,我认为您没有,但我可能是错的),那么您将希望使用 Dispatcher 安排循环的每次迭代......这样 WPF可以将执行的代码与正确重绘所需的 UI 事件散布在其中。

希望这可以帮助。

于 2009-07-13T20:06:47.733 回答
1

我观察到两件事:

  • 如果您为进度条设置 IsIndeterminate="True",它不会从 0 走到 100%,而是一次又一次地从左到右运行(一些 KITT 效果),只有在您不知道的情况下才需要这个,您在进度时间表中的位置。(对于某些样式,您甚至在进度条上什么都看不到,但在 Vista-default 上,它会显示一些从一边到另一边的绿色阴影)
  • 如果您想从后台线程设置您的进度值,您应该通过使用后台工作人员来执行此操作,然后在某些里程碑之后使用名为“ReportProgress”的方法。这样,UI 将执行更新以显示您的新进度。
于 2009-07-13T22:52:58.427 回答
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;
    }

并在后面的代码中写下如下代码,在app运行的时候一直点击ProgressBar

于 2009-07-13T20:07:26.703 回答