我正在 WPF(不是 Windows 窗体)中制作这个简单的程序,它是为大学作业。该程序有两个按钮和一个列表框。当程序启动时,第一个按钮被启用,而第二个按钮被禁用。当用户单击第一个按钮时,会打开一个对话框,上面有一个“确定”按钮。单击“确定”按钮时,它会从目录中获取所有文件名并将其显示在列表框中。但这是使用后台工作人员完成的,因此列表框会在找到文件时逐渐添加文件。现在我想做的是,在后台工作人员完成工作后,即列出目录中的所有文件后,我想让之前禁用的第二个按钮启用。我知道启用或禁用按钮的语法,您将 true 或 false 设置为 . IsEnabled 属性。例如:
//this will disable the button
buttonName.IsEnabled = false;
但我想知道的是我如何以及在哪里使用这个属性(我需要什么额外的代码),以便第二个按钮只有在后台工作人员完全完成其工作后才会启用。使用我目前的代码,一旦单击“确定”按钮并且后台工作人员启动,第二个按钮就会启用。在下面的代码中,“btnSort”是后台工作完成后应该启用的第二个按钮的名称。最后你可能会忽略 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);
}
}
}