好的。我環顧了一些嘗試線程我的UI來完成這項工作。C#線程UI用於等待對話框
我有一個報告信息的應用程序。這項工作如何是一個可以在可滾動區域重複的用戶控件。所以如果有一天需要加載10個報表,它將在可滾動區域加載該控件20次。
我想在加載控件時做一個「Please wait」對話框。但是,在繪製這些控件應該位於後面的可滾動區域時,將UI作爲進度條以線框模式運行時不會生成動畫,似乎存在問題。
試圖在後臺工作中生成控件,但是當它涉及到進度條時,它不會解決問題。
任何想法或提示線程UI繪圖? 我想這就是它。進度條,同時繪製其他控件。
編輯: 我試圖顯示這個「請稍候」對話框作爲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: 似乎與到UI部件的呈現/繪圖。我可以看到這個,因爲我擴展了控制器的這個可滾動區域,所以它們都適合。應用程序凍結,直到用戶界面重新繪製爲滾動條。反之亦然,使其更小。 這似乎是加載控件時發生的凍結類型。所以我猜想,除非有多種UI線程,否則很難找到解決方案,因爲它位於相同的應用程序和此應用程序UI線程中。
現在問題的解決方案是沒有動畫滾動條滾動條的「請稍候」對話框。
將檢查是否有辦法爲此創建一個單獨的應用程序來填充此錢包,因爲這似乎是唯一的解決方案。
您的問題可能是每個控件都是在UI線程上進行的底層工作 - 控件是否加載自己的數據,並且這是在UI線程上完成的? – driis
在沒有看到您的代碼的情況下對此進行診斷非常困難。很明顯,你的代碼正在做一些事情來支持UI線程。你需要找出它是什麼並將它移動到後臺線程。 –
這些生成的控件中的每一個都有一些數據被加載。但正如我所說,我試圖從背景工作者生成和應用這些控制。不應該加載這個數據由後臺處理程序處理?無論如何,因爲這些控件被調用到了UI上,所以還是要用它來獲取UI? –