Тема, прогрессбар Howto - PullRequest
       7

Тема, прогрессбар Howto

1 голос
/ 02 декабря 2011

Я использую XslCompiledTransform для преобразования XML-файла в HTML.Файл XML не такой короткий, поэтому преобразование тратит много времени.

Мой код:

 xslTransform.Transform(fi.FullName, TMP_TRANSFORMED_XML_PATH);
 webBrowser1.Navigate(TMP_TRANSFORMED_XML_PATH);

Поэтому я хочу использовать индикатор выполнения или (лучше) значок прогресса (диалоговое окно?) которая не связана с формой.

Проблема в том, что у меня есть две формы.Первый имеет список элементов и кнопку, когда элемент выбран и кнопка нажата, отображается вторая форма (не модальная), файл XML преобразуется и отображается в элементе управления WebBrowser.

Во втором конструкторе формы я вызываю XslCompiledTransform.Load, инициализирую элементы управления и затем вызываю XslCompiledTransform.Transform().

Во второй форме у меня также есть кнопки для навигации между элементами списка 1-й формы.Поэтому, когда я нажимаю «>», выбирается следующий элемент из 1-й формы, и элементы 2-й формы перезагружаются - например, изменяется некоторый текст, и снова вызывается XslCompiledTransform.Transform () для нового файла XML.1017 * Итак, как организовать индикатор выполнения при загрузке 2-й формы каждый раз?

Из 1-й формы:

private void OpenSecondForm()
{
    if (formTwo == null)
    {
            formTwo = new FormTwo(this, culture, params);
            formTwo .Show();
    }
    else
    {
            if (formTwo .IsDisposed)
            {
                formTwo = new FormTwo(this, culture, params);
                formTwo .Show();
            }
            else
            {
                formTwo .Reinitialaze(culture, invoice);
            }
            formTwo .BringToFront();
    }

}

public void SelectRow(int moveTo)
{
    try
    {
      /*navigate on list here */
  /* ... */

OpenSecondForm();
    }
    catch (Exception e)
    { MessageBox.Show(e.Message, "ERROR"); }
}

2-я форма:

public FormTwo(Form parent, CultureInfo cultr, string params)
{
    culture = cultr;

    parentForm = parent;
    rm = new ResourceManager("MyProject.Resource", typeof(FormOne).Assembly);
    InitializeComponent();

    xslTransform = new XslCompiledTransform();
    xslTransform.Load(XSL_TRANSFORM_SCHEMA_NAME);

    ReInitialazeAll();

}

internal void Reinitialaze(CultureInfo cultr, string params)
{
    culture = cultr;

    ReInitialazeAll();
}

private void ReInitialazeAll()
{
    SelectDatabaseData();

    InitCaptions();
    InitForms();

}

private void InitForms()
{
    EnableDisableButtons();
    webBrowser1.DocumentText = "<HTML><BODY></BODY></HTML>";

    FillXmlData();
}

private void FillXmlData()
{
    xslTransform.Transform(fi.FullName, TMP_TRANSFORMED_XML_PATH);
    webBrowser1.Navigate(TMP_TRANSFORMED_XML_PATH);
}

Я пытался создать поток для выполнения этих FillXmlData.Но мои формы все еще недоступны, пока xml трансформируется.

1 Ответ

1 голос
/ 02 декабря 2011

Вам необходимо запустить преобразование XML (и любые другие длительные операции загрузки без пользовательского интерфейса) в отдельном потоке.Примерно так:

public FormTwo(Form parent, CultureInfo cultr, string params)
{
    culture = cultr;

    parentForm = parent;
    rm = new ResourceManager("MyProject.Resource", typeof(FormOne).Assembly);

    InitializeComponent();

    // Show the progress bar
    this.ProgressBar.Visible = true;

    // Load on another thread
    Thread loadingThread = new Thread(new ThreadStart(TransformXml));
    loadingThread.Start();
}

private void TransformXml()
{
    xslTransform = new XslCompiledTransform();
    xslTransform.Load(XSL_TRANSFORM_SCHEMA_NAME);

    ReInitialazeAll();
}

Примечание. Предполагается, что индикатор выполнения называется ProgressBar.

. Однако необходимо помнить, что вы не можете получить доступ к элементам пользовательского интерфейса в другом потоке, поэтомувызов ReInitialazeAll() (который содержит опечатку) должен быть вызван в потоке пользовательского интерфейса.Это можно безопасно выполнить, выполнив что-то вроде:

private void ReInitialazeAll()
{
    // Make sure we're running on the UI thread
    if (this.InvokeRequired)
    {
        BeginInvoke(new Action(ReInitialazeAll));

        return;
    }

    // Hide the progress bar
    this.ProgressBar.Visible = false;

    // ... execute UI-related code
}

Это должно дать вам достаточно приличное начало, с которого вы можете работать.

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