13

私のWPFアプリケーションでは、以下のように書いているタイマーティックイベントでプログレスバーの進行状況を表示する必要があります。

System.Windows.Forms.Timer timer;
public MainWindow()
{
    timer = new System.Windows.Forms.Timer();
    timer.Interval = 1000;
    this.timer.Tick += new System.EventHandler(this.timer_Tick);
}

以下のロードイベント

private void Window_Loaded(object sender, RoutedEventArgs e)
{
      progressBar1.Minimum = 0;
      progressBar1.Value = DateTime.Now.Second;
      progressBar1.Maximum = 700;
      timer.Start();         
 }

そして最後にティックイベントで、

private void timer_Tick(object sender, EventArgs e)
{
    Duration duration = new Duration(TimeSpan.FromSeconds(20));

    //progress bar animation
    System.Windows.Media.Animation.DoubleAnimation doubleanimation = new    System.Windows.Media.Animation.DoubleAnimation(200.0, duration);
    progressBar1.BeginAnimation(ProgressBar.ValueProperty, doubleanimation);
}

プログラムのプログレスバーに 2 ~ 3 本のバーの進行状況が表示された後、インクリメントが停止します。その後、進行にはまったく影響がありません。

なんで?

4

4 に答える 4

10

あなたProgressBarは特定の行動に関連していないので、不確定バーの仕事のように見えます。

This other SO questionは、それについての洞察を提供します。つまり、これは XAML ワンライナーです。

<!-- MinVal, MaxVal, Height needed for this to work -->
<ProgressBar x:Name="progressBar1" Margin="5" IsIndeterminate="True" 
    MinimumValue="0" MaximumValue="700" value="0" Height="20"/> 

コードでは、次のようになります。

progressBar1.IsIndeterminate = true; // start animation
progressBar1.IsIndeterminate = false; // stop animation
于 2013-03-15T10:22:46.730 に答える
9

私のWPFアプリケーションでは...System.Windows.Forms.Timer timer;

それは間違ったタイプのタイマーです。代わりにDispatcherTimerを使用してください。

プログラムを実行すると、プログレスバーに2〜3本のバーの進行状況が表示され、その後停止します

これは私を驚かせます、私はそれがまったくうまくいくとは思っていなかったでしょう。これは、メイン (ディスパッチャ) スレッドのブロックなど、他の問題も発生している可能性があることを意味します。

Loaded イベントで値を 1 回だけ設定しています。

     progressBar1.Value = DateTime.Now.Second;

progressBar1.ValueTick イベントに変更はありません。それで、動きが止まったと考えます。

于 2013-03-15T10:07:03.037 に答える
4

Timer (Forms オブジェクト) の代わりに DispatcherTimer を使用し、ProgressBar の Value プロパティを使用します。

これを試して:

MainWindows.xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="55" Width="261">
    <Grid>
        <ProgressBar Name="pb" Maximum="60" />
    </Grid>
</Window>

MainWindows.xaml.cs:

using System.Windows;
using System.Windows.Threading;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        private DispatcherTimer timer;
    
        public MainWindow()
        {
            InitializeComponent();

            this.timer = new DispatcherTimer();
            this.timer.Tick += timer_Tick;
            this.timer.Interval = new System.TimeSpan(0, 0, 1);
            this.timer.Start();
        }

        private void timer_Tick(object sender, System.EventArgs e)
        {
            this.pb.Value = System.DateTime.Now.Second % 100;
        }
    }
}

Value プロパティを変更することで、プログレス バーの動作を変更できます (xaml で Maximum プロパティを定義することを忘れないでください)。

于 2013-03-15T12:49:11.787 に答える
3

これ ( WPF Multithreading: Using the BackgroundWorker and Reporting the Progress the Progress to the UI. link ) には、ダイアログ ボックスはあるものの、私のニーズに対する優れたソリューションが含まれていることがわかりました。

私が非常に便利だと思ったことの 1 つは、ワーカー スレッドが (独自のメソッドで) MainWindow のコントロールにアクセスできなかったことです。ただし、メイン ウィンドウのイベント ハンドラー内でデリゲートを使用すると、それが可能でした。

worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
    pd.Close();
    // Get a result from the asynchronous worker
    T t = (t)args.Result
    this.ExampleControl.Text = t.BlaBla;
};
于 2013-09-23T20:44:14.560 に答える