如果你有大量的Shape實例,你可能可以異步構造它們(在工作線程上),並通過Dispatcher排隊實際的Add操作。這裏的想法是,UI不會立即完成,但用戶可以立即開始交互,而元素將繼續加載。
編輯:上面是不正確的。 WPF確實需要在UI線程上創建視覺元素。你仍然可以使用的模式是這樣完成這種「懶惰」的視覺負荷:
private Random _random = new Random();
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Thread testThread = new Thread(TestThread);
testThread.Start();
}
private void TestThread()
{
for (int i = 0; i < 1000; i++)
{
Dispatcher.BeginInvoke((Action)CreateShape);
}
}
private void CreateShape()
{
var shape = new Rectangle();
shape.Width = _random.Next(10, 50);
shape.Height = _random.Next(10, 50);
shape.Fill = new SolidColorBrush(Colors.Red);
Canvas.SetLeft(shape, _random.Next(0, 400));
Canvas.SetTop(shape, _random.Next(0, 200));
LayoutRoot.Children.Add(shape);
}
這基本上排隊UI線程上進行「異步」運行的任務(即每當消息泵正在維修) ,因此您可以在執行「長期」UI更新時保持響應能力。
-1:基本的Windows UI知識:UI元素必須在UI線程中創建 - 這裏沒有工作線程,夥計;) – TomTom 2010-04-26 23:30:26
我站着糾正;我測試了這一點,創建一個Visual依賴於線程上下文。我以爲它可能不會將它連接到UI基礎結構,直到您真正將其添加到Visual Tree。 – 2010-04-27 01:53:18
這是一個老問題,回到活動x次,並基本保持兼容性 - 您永遠不知道子元素是否開始放置可能是活動x控件的窗體元素;) – TomTom 2010-04-27 07:07:40