Анимированный Gif в форме с использованием C # - PullRequest
5 голосов
/ 18 июня 2010

В моем проекте всякий раз, когда выполняется длинный процесс, отображается маленькая форма с небольшим анимированным GIF-файлом.Я использовал this.Show (), чтобы открыть форму, и this.Close (), чтобы закрыть форму.Ниже приведен код, который я использую.

public partial class PlzWaitMessage : Form
{
   public PlzWaitMessage()
   {
      InitializeComponent();
   }

   public void ShowSpalshSceen()
   {
      this.Show();
      Application.DoEvents();
   }

   public void CloseSpalshScreen()
   {
      this.Close();
   }
}

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

Ответы [ 3 ]

4 голосов
/ 18 июня 2010

Почему бы не использовать темы?Это всегда хорошая идея, чтобы узнать что-то новое.

Вы можете просто поместить свой "длинный процесс" в фоновый поток и использовать события для отчета на уровне представления, например:

// in your "long process" class
public event Action<double> ReportCompletition;

// this method will start long process in separate background thread
public void Start()
{ 
    Thread thread = new Thread(this.LongProcess);
    thread.IsBackground = true;
    thread.Start();
}

private void LongProcess()
{
    // do something
    // report 10% completition by raising event
    this.ReportCompletition(0.1);
    // do something more
    this.ReportCompletition(0.5);
    // ... and so on
}

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

public partial class MainApplicationWindow : Form
{
    private LongProcessClass _longProcess;

    public MainApplicationWindow
    {
        this.InitializeComponent();
        this._longProcess = new LongProcessClass();
        // bind UI updating method to long process class event
        this._longProcess.ReportCompletition += this.DisplayCompletitionInfo;
    }

    private void DisplayCompletitionInfo(double completition)
    {  
        // check if control you want to display info in needs to be invoked
        // - request is coming from different thread
        if (control.InvokeRequired)
        {
            Action<double> updateMethod = this.DisplayCompletitionInfo;
            control.Invoke(updateMethod, new object[] { completition });
        }
        // here you put code to do actual UI updating, 
        // eg. displaying status message
        else
        {
            int progress = (int) completition * 10;
            control.Text = "Please wait. Long process progress: " 
                + progress.ToString() + "%";
        }
    }

Конечно, вы можете сообщать обо всем, что вам нравится, в течение длительного процесса.Будь то скорость завершения, готов к отображению строковых сообщений, что угодно.Вы также можете использовать события, чтобы сообщить о том, что длительный процесс завершился, прервался или о каких-либо длинных данных процесса, которые вы хотите.

Для получения более подробной информации по этой теме вы можете проверить учебники MSDN по Threading и События .

3 голосов
/ 18 июня 2010

Вы должны выполнить «длинный процесс» в отдельном потоке.Я советую использовать BackgroundWorker .

Это сделает ваш код более сложным.Одна из основных причин заключается в том, что вы не можете общаться с пользовательским интерфейсом из фонового потока.

Также обратите внимание на предупреждение на связанной странице:

Внимание

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

Если это слишком сложно, вы можете очень часто вызывать Application.DoEvents из кода «длинного процесса».

Что бы вы ни выбрали, это позволит пользователю взаимодействовать с вашей формой.Например, закрыв его.Вы должны знать об этом.

0 голосов
/ 24 апреля 2013

Используйте gif в PictureBox и откройте его, используя Form pWait = new Form(); pWait.Show();

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