0

私はWPFでbackgroundworkerクラスを学んでいます。以下のコードはファイル MainWindow.xaml.cs にあります

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.ComponentModel;

namespace FrontEnd
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private BackgroundWorker backGroundWorker;

        public MainWindow()
        {
            InitializeComponent();
            backGroundWorker = ((BackgroundWorker)this.FindResource("backgroundWorker"));
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {

            button1.IsEnabled = false;
            Flow pro = new Flow(20,10);
            backGroundWorker.RunWorkerAsync(pro);
        }

        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            Flow pro = (Flow)e.Argument;
           e.Result = pro.NaturalNumbers();
        }

        private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value= e.ProgressPercentage;
        }

        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if ((int)e.Result == 1) MessageBox.Show("DONE");
            progressBar1.Value = 0;
        }
    }
}

以下のコードは Flow.cs ファイルにあります

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace FrontEnd
{
    class Flow
    {
        long i;
        //private int x,y;
        public int X
        {
            get; set;
        }
        public int Y
        {
            get; set;
        }

        public Flow(int x, int y)
        {
            X = x;
            Y = y;
        }
        public int NaturalNumbers()
        {
            for (i = 0; i < 9999; i++)
            {
                Console.WriteLine(i);
                long iteration = i * 100 / 9999;
                if ((i % iteration == 0) &&
                (backgroundWorker != null) && backgroundWorker.WorkerReportsProgress)
                {
                    backgroundWorker.ReportProgress(iteration);
                }
            }
            return 1;
        }
    }
}

エラー : 名前 'backgroundWorker' は現在のコンテキストに存在しません

プログレスバーを機能させるにはどうすればよいですか?

4

2 に答える 2

2

動作する簡単な例を次に示します。

public partial class BackgroundWorkerPage : Page
{
    private readonly BackgroundWorker _worker = new BackgroundWorker();

    public BackgroundWorkerPage()
    {
        InitializeComponent();

        _worker.DoWork += WorkerOnDoWork;
        _worker.WorkerReportsProgress = true;
        _worker.ProgressChanged += WorkerOnProgressChanged;
    }

    private void WorkerOnProgressChanged(object sender, ProgressChangedEventArgs progressChangedEventArgs)
    {
        progressBar.Value = progressChangedEventArgs.ProgressPercentage;
    }

    private void WorkerOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
    {
        for (int i = 0; i <= 100; i++)
        {
            Thread.Sleep(50);
            _worker.ReportProgress(i);
        }
    }

    private void Button_Click_1(object sender, System.Windows.RoutedEventArgs e)
    {
        _worker.RunWorkerAsync();
    }
}

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <ProgressBar x:Name="progressBar" Height="23" Minimum="0" Maximum="100"/>
    <Button Grid.Row="1" Height="23" Content="Start" Click="Button_Click_1"/>
</Grid>

そして、コードを少し変更する必要があります

private void WorkerOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
{
    var flow = new Flow(_worker);
    flow.NaturalNumbers();
}

internal class Flow
{
    private readonly BackgroundWorker _worker;

    public Flow(int x, int y)
    {
        X = x;
        Y = y;
    }

    public Flow(BackgroundWorker worker)
    {
        _worker = worker;
    }

    public int X { get; set; }
    public int Y { get; set; }

    public int NaturalNumbers()
    {
        for (int i = 0; i <= 9999; i++)
        {
            int iteration = i*100/9999;

            // your if(...) fails with divide by zero exception

            _worker.ReportProgress(iteration);
        }

        return 1;
    }
}
于 2012-04-09T09:39:01.477 に答える