2016-11-18 99 views
1

我試圖創建一個類來處理我的下載一件事我遇到更新UI是錯誤嘗試從另一個類

調用或BeginInvoke無法控制被調用,直到窗口手柄已創建

我試圖運行的代碼是

public bool TransferProgress(TransferProgress progress) 
    { 
     if (!mainform.IsHandleCreated) 
     { 
      mainform.CreateControl(); 
     } 
     mainform.amountdl.Invoke((MethodInvoker)(() => mainform.amountdl.Text = "Downloaded " + progress.ReceivedObjects + "/" + progress.TotalObjects)); 
     if (progress.TotalObjects == progress.ReceivedObjects) 
     { 
      mainform.amountdl.Invoke((MethodInvoker)(() => mainform.amountdl.Text = "Configuring Files Please Wait."));    
     } 
     return true; 
    } 

往上頂我還以爲是創建一個窗口句柄,但C#不同意我的看法。最後但並非最不重要的。

DoxramosManager mainform = new DoxramosManager(); 

在我的課堂上達到了頂峯。我的課不是Winforms表單。

+0

你應該使用'await'代替。 – SLaks

+0

我會研究它。 C#的新手,所以甚至不知道從哪裏開始。 –

回答

0

在調用invoke之前,您需要確保表單已加載。嘗試使用Loaded事件。

編輯:事情是這樣的,也許:

if (!mainform.IsHandleCreated) 
     { 
      mainform.CreateControl(); 

      mainform.Loaded += (s, ea) => 
      { 
       mainform.amountdl.Invoke((MethodInvoker)(() => mainform.amountdl.Text = "Downloaded " + progress.ReceivedObjects + "/" + progress.TotalObjects)); 
       if (progress.TotalObjects == progress.ReceivedObjects) 
       { 
        mainform.amountdl.Invoke((MethodInvoker)(() => mainform.amountdl.Text = "Configuring Files Please Wait.")); 
       } 
      }; 
     } 
     else 
     { 
      mainform.amountdl.Invoke((MethodInvoker)(() => mainform.amountdl.Text = "Downloaded " + progress.ReceivedObjects + "/" + progress.TotalObjects)); 
      if (progress.TotalObjects == progress.ReceivedObjects) 
      { 
       mainform.amountdl.Invoke((MethodInvoker)(() => mainform.amountdl.Text = "Configuring Files Please Wait.")); 
      } 
     } 
+0

但它不是一種形式,可以在c#腳本上觸發加載的事件嗎? –

+0

Invoke和BeginInvoke用於訪問UI線程上的對象。所以這裏的假設是被調用的父對象存在於UI中並且已經被完全加載。 – Kris

+0

我想弄清楚Loaded事件是什麼。我試過把它拉到文件上,到處都是我看,我沒有運氣。 –