私はこの単純なプログラムを (Windows フォームではなく) WPF で作成しています。これは大学での課題用です。プログラムには 2 つのボタンとリストボックスがあります。プログラムが起動すると、最初のボタンが有効になり、2 番目のボタンが無効になります。ユーザーが最初のボタンをクリックすると、[OK] ボタンのあるダイアログ ボックスが開きます。「OK」ボタンをクリックすると、ディレクトリからすべてのファイル名を取得し、リストボックスに表示します。ただし、これはバックグラウンド ワーカーを使用して行われるため、リストボックスはファイルが見つかると徐々にファイルを追加します。ここでやりたいことは、バックグラウンドワーカーが作業を完了した後、つまりディレクトリ内のすべてのファイルをリストした後、以前は無効になっていた2番目のボタンを有効にしたいということです。ボタンを有効または無効にする構文を知っています。 true または false を に設定します。IsEnabled プロパティ。例えば:
//this will disable the button
buttonName.IsEnabled = false;
しかし、私が知りたいのは、バックグラウンド ワーカーがジョブを完全に完了した後にのみ 2 番目のボタンが有効になるように、このプロパティをどこでどのように使用するか (どのような追加コードが必要か) です。私の現在のコードでは、「OK」ボタンがクリックされるとすぐに、およびバックグラウンドワーカーが開始されるとすぐに、2 番目のボタンが有効になります。以下のコードで、「btnSort」は、バックグラウンド ワーカーが完了した後に有効にする必要がある 2 番目のボタンの名前です。最後の DirSearch メソッドはおそらく無視できます。これは、ディレクトリからファイルを取得するための単なるメソッドです。ディレクトリを検索する方法が他にもあることは知っていますが、この方法を使用するように言われました。
public partial class MainWindow : Window
{
BackgroundWorker backgroundWorker;
string sourcePath = "";
List<string> list1 = new List<string>();
public MainWindow()
{
InitializeComponent();
backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerReportsProgress = true;
//take this out if cancel not used
backgroundWorker.WorkerSupportsCancellation = true;
backgroundWorker.DoWork +=
new DoWorkEventHandler(backgroundWorker_DoWork);
backgroundWorker.ProgressChanged +=
new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
try
{
System.Windows.Forms.FolderBrowserDialog folderDialog = new System.Windows.Forms.FolderBrowserDialog();
folderDialog.SelectedPath = @"C:\temp";
System.Windows.Forms.DialogResult result = folderDialog.ShowDialog();
if (result.ToString() == "OK")
{
if (listBox1.Items.Count != 0)
{
listBox1.Items.Clear();
}
if (list1.Count != 0)
{
list1.Clear();
}
sourcePath = folderDialog.SelectedPath;
backgroundWorker.RunWorkerAsync(sourcePath);
if (btnSort.IsEnabled == false)
{
btnSort.IsEnabled = true;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
DirSearch(e.Argument.ToString());
MessageBox.Show("Complete!");
}
private void backgroundWorker_ProgressChanged(object sender,
ProgressChangedEventArgs e)
{
FileFetchState state = (FileFetchState)e.UserState;
listBox1.Items.Add(state.FetchedFile);
}
public class FileFetchState
{
public string FetchedFile
{
get;
set;
}
public FileFetchState(string fetchedFile)
{
FetchedFile = fetchedFile;
}
}
public void DirSearch(string sourcePath)
{
try
{
foreach (string f in Directory.GetFiles(sourcePath))
{
string fileName = System.IO.Path.GetFileName(f);
if (!listBox1.Items.Contains(fileName))
{
//code for adding to list1
list1.Add(fileName);
backgroundWorker.ReportProgress(0,
new FileFetchState(fileName));
System.Threading.Thread.Sleep(1);
}
}
foreach (string d in Directory.GetDirectories(sourcePath))
{
DirSearch(d);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}