2012-06-20 25 views
0

我有一個面板,我在代碼中構建並用用戶控件填充它。 當它完成填充時,我向主GUI發出一個事件,告訴它人口已完成,並通過堆棧面板。添加StackPanel到Grid.Children集合從另一個線程

然後,我想將此面板添加到容器網格。

我已經試過

grdPbContent.Dispatcher.Invoke(
     DispatcherPriority.Normal, 
     new Action<StackPanel>(
      delegate(StackPanel _sp) 
      { 
       grdPbContent.Children.Add(_sp); 
      } 
     ), 
     sp);` 

,也是空的委託選項,但總是得到異常從TargetOfInvocation

我在做什麼錯?

+1

在擁有網格的線程上創建堆棧面板 – Andy

+0

謝謝Andy。但是,我創建了堆棧面板作爲響應回調,並在一個gui幫助器類,所以我正在尋找一個不同的解決方案 - 如果一個存在。 – gilad

回答

0

我不知道你在做什麼錯,但它應該通過簡單地使用調度器工作。嘗試使用包含面板窗口的調度員:

MyWindow.Dispatcher.Invoke((Action)delegate 
    { 
     MyWindow.grdPbContent.Children.Add(_sp); 
    }); 
0

WPF對象不能比創建它們,所以你不能在一個線程創建一個StackPanel並將其添加到另一個線程修改這是另一個線程

要在後臺做處理創造了Grid,使用Dispatcher以不同DispatcherPriority運行代碼,如Background

您可以使用Application.Current.Dispatcher獲得UI線程你當前從你的代碼中的任何地方應用

如果這是一個非常長的進程,無論其運行的優先級如何,都會鎖定UI,然後僅從另一個線程獲取數據,並在返回數據後在主UI線程上構建UI對象。

+0

嗨雷切爾感謝您的答案。這正是問題所在。我有很多長處理任務,每個任務結束時,我都會向主GUI提出一個事件,告訴他 - 更新!所以我想知道 - 將用戶控件列表傳遞給GUI會更好嗎,然後將它們添加到堆棧面板的子集合中?在此先感謝(你有沒有修改我的無知?..) – gilad

相關問題