我有一个MVVM实现,其中我有一个WPF ListBox,它将包含一个子WPF图像控件的集合。每个控件的Source可能每秒更改3次。当我的列表中只有一个图像时,生活很美,我的应用程序响应迅速。当我开始有4或5个我的应用程序子图像时,我的应用程序开始研磨,我还应该提到我必须对每个新的和/或更新的图像进行Bitmap to BitmapSource转换。
如何在保持应用程序尽可能响应的同时更新我的子控件Source属性?
以下是我的ViewModel中的当前代码:
public BitmapSource CameraBitmapSource
{
get
{
Application.Current.Dispatcher.BeginInvoke((Action)delegate
{
BuildImageSource();
}, DispatcherPriority.Background);
return this.cameraBitmapSource;
}
}
BuildImageSource()是我获取新位图并转换为BitmapSource然后分配给我的私有cameraBitmapSource对象的地方。
答案 0 :(得分:5)
因为您使用Dispatcher.BeginInvoke
,所以您正在对UI线程进行所有工作,这会使您的应用无响应。您应该在单独的线程上构建映像。最简单的方法是使绑定异步,并直接调用BuildImageSource
方法。
<强>视图模型强>
public BitmapSource CameraBitmapSource
{
get
{
BuildImageSource();
return this.cameraBitmapSource;
}
}
<强> XAML 强>
<Image Source="{Binding CameraBitmapSource, IsAsync=True}" />
只需记住Freeze
ImageSource
中BuildImageSource
以便它可以在UI线程上使用(DependencyObjects
只能在创建它们的线程上使用,Freezable
除非它们是{{1}}并冻结)