Обновление пользовательского интерфейса - PullRequest
1 голос
/ 06 марта 2012

У меня есть ListBox, в который я помещаю некоторые файлы, если файл не является AVI, я автоматически преобразую его, но я хочу, чтобы сообщение о преобразовании файлов записывалось на этикетке, чтобы файлы теперь преобразовывались в другой формат, я знаю, что мне нужноиспользуйте Dispatcher для обновления потока пользовательского интерфейса, но теперь я использую Winform вместо WPF, и мне нужна помощь с этим.Кстати, я не могу использовать задачу, потому что я использую .Net 3.5

private void btnAdd_Click(object sender, EventArgs e)
{
    System.IO.Stream myStream;
    OpenFileDialog thisDialog = new OpenFileDialog();
    thisDialog.InitialDirectory = "c:\\";
    thisDialog.Filter = "All files (*.*)|*.*";
    thisDialog.FilterIndex = 1;
    thisDialog.RestoreDirectory = false;
    thisDialog.Multiselect = true; // Allow the user to select multiple files
    thisDialog.Title = "Please Select Source File";
    thisDialog.FileName = lastPath;
    List<string> list = new List<string>();

    if (thisDialog.ShowDialog() == DialogResult.OK)
    {
        foreach (String file in thisDialog.FileNames)
        {
            try
            {
                if ((myStream = thisDialog.OpenFile()) != null)
                {
                    using (myStream)
                    {
                        listBoxFiles.Items.Add(file);
                        lastPath = file;
                    }
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
            }
        }

        for (int i = 0; i < listBoxFiles.Items.Count; i++)
        {
            string path = (string)listBoxFiles.Items[i];
            FileInfo fileInfo = new FileInfo(path);

            if (fileInfo.Extension != ".AVI")
            {
                listToRemove.Add(path);
            }
        }

        (new System.Threading.Thread(sendFilesToConvertToPcap)).Start();

        foreach (string file in listToRemove) //remove all non .AVI files from listbox
        {
            listBoxFiles.Items.Remove(file);
        }
    }
}

эта функция должна изменить метку:

        public void sendFilesToConvertToPcap()
        {
            if (listToRemove.Count == 0) // nothing to do
            {
                return;
            }

lblStatus2.Content = "Convert file to .AVI...";

            foreach (String file in listToRemove)
            {
                FileInfo fileInfo = new FileInfo(file);
                myClass = new (class who convert the files)(fileInfo);
                String newFileName = myClass.mNewFileName;
                listBoxFiles.Items.Add(myClass._newFileName);
            }

lblStatus2.Content = "Finished...";

        }

Ответы [ 3 ]

2 голосов
/ 06 марта 2012

Судя по вашему вопросу, вы хотите конвертировать несколько файлов. Возможно, вы захотите использовать класс BackgroundWorker и перезаписать события DoWork и ProgressChanged, как описано в этой статье . Вы можете обновить метку и другие элементы управления в событии ProgressChanged.

0 голосов
/ 06 марта 2012
public void sendFilesToConvertToPcap()
{
   .....
   ....
   this.Invoke((MethodInvoker)delegate {
   lblStatus2.Text = "Convert file to .AVI..."; });

 ....
}
0 голосов
/ 06 марта 2012

Это очень распространенное требование для длительных процессов. Если вы явно не вызываете методы в отдельном потоке, они автоматически запускаются в основном (см .: UI) потоке и приводят к передаче вашего пользовательского интерфейса (как я подозреваю, вы уже знаете).

http://www.dotnetperls.com/backgroundworker

Вот старая, но превосходная ссылка с примером того, как использовать фоновый рабочий для обработки пула потоков для вас.

Таким образом, вы можете просто создать работника, который будет управлять процессом конвертации в отдельном потоке, и я считаю, что есть даже пример для создания панели процессов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...