Хорошо.Я осмотрел некоторые из них, пытаясь проделать свой пользовательский интерфейс, чтобы заставить это работать.
У меня есть приложение для сообщения информации.Как это работает, что я пользовательский элемент управления, который может повторяться в прокручиваемой области.поэтому, если за день загружается 10 отчетов, он будет загружать этот элемент управления 20 раз в прокручиваемой области.
Я хотел бы создать диалоговое окно «Пожалуйста, подождите» при загрузке этих элементов управления.Но, по-видимому, существует проблема, связанная с тем, что пользовательский интерфейс в потоке в режиме Marquee не анимируется при рисовании этих элементов управления, которые должны находиться в прокручиваемой области позади.
Попытка создать элементы управления в фоновом режиме, но это не поможетпроблема, когда дело доходит до индикатора выполнения.
Есть ли идеи или советы, когда дело доходит до многопоточности рисования пользовательского интерфейса?Как я полагаю, это то, что есть.Индикатор выполнения при рисовании других элементов управления.
РЕДАКТИРОВАТЬ: я пытался показать это диалоговое окно «Пожалуйста, подождите» как Show();
и ShowDialog();
.ShowDialog () работает, но только потому, что приостанавливает работу остальных приложений, ожидая ответа.
Вот код, генерирующий элементы управления.это не многопоточная версия для фона.но единственная разница заключается в том, где в коде находится диалоговое окно "pleaseWait".
/// <summary>
/// Generates assignemts after date
/// </summary>
/// <param name="date">Date for selection of what to show</param>
/// <param name="currentWeek">Week to show</param>
/// <param name="igonerWeekCheck">Ignor week check, used for startup</param>
private void GenerateAssigmentsAfterDate(DateTime date, int currentWeek, bool igonerWeekCheck)
{
//refresh UI before generating contens
tabPage1.Refresh();
panelScroller.Refresh();
splitContainer1.Refresh();
//freezes UI while loading
SuspendDrawing(splitContainer1);
panelScroller.SuspendLayout();
if (CurrentTMEngine.LatestWeekNumber != GetWeekNumber(date) || igonerWeekCheck == true)
{
if (igonerWeekCheck == false)
{
pleaseWait = PleaseWaitDialog();
pleaseWait.StartPosition = FormStartPosition.CenterParent;
pleaseWait.Show();
pleaseWait.Update();
}
//should remove current controls from memory
int ctrlCount = panelScroller.Controls.Count;
for (int i = 0; i < ctrlCount; i++)
{
panelScroller.Controls[0].Dispose();
}
panelScroller.Refresh();
assignmentList.Clear();
assignmentList = null;
assignmentList = new List<messageCtrl>();
int rowCountCtrl = 0;
foreach (DataRow row in CurrentTMEngine.TMassignmentsTable.Rows)
{
if (currentWeek == GetWeekNumber(Convert.ToDateTime(row[new TableText().TimeStart]).Date))
{
messageCtrl repCtrl = new messageCtrl(rowCountCtrl, Convert.ToInt32(row[new TableText().ID]),
Convert.ToDateTime(row[new TableText().TimeStart]), Convert.ToDateTime(row[new TableText().TimeEnd]),
panelScroller.Controls, CurrentTMEngine.TMassignmentsTable, row, CurrentTMEngine);
assignmentList.Add(repCtrl);//collection to be avalie for show
rowCountCtrl++;
}
}
foreach (messageCtrl assign in assignmentList)
{
if (currentWeek == GetWeekNumber(assign.StartTime.Date))
{
if (assign.StartTime.Date == date)
{
assign.Enabled = true;
assign.Height = 142;
assign.tableLayoutPanel2.BackColor = System.Drawing.SystemColors.ControlLightLight;
}
else
{
assign.Enabled = false;
assign.Height = 5;
assign.tableLayoutPanel2.BackColor = System.Drawing.SystemColors.ControlDark;
}
panelScroller.Controls.Add(assign); //ands control
}
}
// SetSizeMessageCtrlByDate(date, currentWeek);
pleaseWait.Close();
pleaseWait.Dispose();
}
else
{
SetSizeMessageCtrlByDate(date, currentWeek);
}
CurrentTMEngine.LatestWeekNumber = GetWeekNumber(date);
//unfrezzing UI
panelScroller.ResumeLayout();
ResumeDrawing(splitContainer1);
}
#endregion
EIDT 2: Кажется, что оно связано с рендерингом / рисованием компонентов пользовательского интерфейса.Я вижу это, когда расширяю область прокрутки для контроллеров, чтобы они все подходили.Приложение останавливается до тех пор, пока пользовательский интерфейс не будет перерисован, чтобы быть без полосы прокрутки.И наоборот, чтобы сделать его меньше для прокрутки.Похоже, это тип зависания, возникающего при загрузке элементов управления.Поэтому я думаю, что если нет способа иметь несколько потоков пользовательского интерфейса, может быть трудно найти решение для этого, так как оно находится в одном приложении и в потоке пользовательского интерфейса этого приложения.
Решением проблемы прямо сейчас является диалоговое окно «Пожалуйста, подождите» без анимированной полосы прокрутки Marquee.
Проверьте, есть ли способ создать отдельное приложение для этого, чтобы заполнить этокошелек, как это кажется единственным решением.