【发布时间】:2011-12-14 10:51:53
【问题描述】:
我有一个 WPF 应用程序,它正在数据库中寻找新图像,如果出现问题,它会将图像添加到列表中。当引发该事件时,我希望它将图像添加到 StackPanel 中。
首先我尝试只插入图像,但收到InvalidOperationException 说“调用线程必须是 STA,因为许多 UI 组件都需要这个。”并想出了:
public void Instance_GraphicChanged(object sender, PropertyChangedEventArgs e)
{
foreach (Model.Graphic item in Model.IncomingCall.Instance.Graphics)
{
if(!_strings.Contains(item.ImageId.ToString()))
{
Thread thread = new Thread( new ThreadStart(
delegate()
{
//sp_images StackPanel for Images
sp_images.Dispatcher.Invoke(
DispatcherPriority.Normal, new Action(
delegate()
{
Image img = new Image();
img.Source = item.ImageObj; //ImageObj returns a BitmapImage
sp_images.Children.Add(img);
}
));
}
));
_strings.Add(item.ImageId.ToString());
}
}
}
这不会引发任何异常,但实际上什么也没发生......
【问题讨论】:
-
您不需要创建一个新线程来调用
Dispatcher。相反,您应该使用代表致电sp_images.Dispatcher.BeginInvoke(...)。另外,您是否尝试过将图像生成绑定到ItemsControl?您可以使用模板将其转换为StackPanel,然后使用ObservableCollection中包含的BitmapImage对象。