如果你有大量的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