0

我正在 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);
            }
        }
    }
4

0 回答 0