我想創建一個不同的線程Grid
元素(創建整個電網是昂貴)和StackPanel
通過Dispatcher
更新。但無論我做什麼,調用Dispatcher
總是會拋出一個InvalidOperationException
。Dispatcher.Invoke()的參數,它總是引發InvalidOperationException
這裏是我的代碼:
Grid grid = new Grid();
Dispatcher.Invoke(() => stackPanel.Children.Add(grid));
我已經試過什麼:
Closing over a variable [沒工作]
Grid grid = new Grid(); Grid closedOverGrid = grid; Dispatcher.Invoke(new Action(() => stackPanel.Children.Add(closedOverGrid)));
Using BeginInvoke [沒't work]
//declaring this in another thread. Grid grid = new Grid(); AddToPanel(grid); private void AddToPanel(Grid grid) { Dispatcher.BeginInvoke((Action)(() => { stackPanel.Children.Add(grid); })); }
Using a full declaration with DispatcherPriority [沒工作]
Grid grid = new Grid(); System.Windows.Application.Current.Dispatcher.BeginInvoke( DispatcherPriority.Background, new Action(() => stackPanel.Children.Add(grid)));
Tried the .Freeze() method [沒工作]
Grid grid = new Grid(); grid.Freeze(); // Not possible.
難道真的不可能,或我錯過了什麼嗎?感謝您的回答/評論。
你不應該在非UI線程上創建'Grid'(和任何UI元素),因爲一旦你這樣做了,它就不能在UI線程上使用。這是標準的DispatcherObject行爲(請注意,當前的調度程序在構造函數中被記住並且永遠不會改變)。 –