MVVM,线程和图像源DataBinidng

时间:2011-06-02 02:28:03

标签: wpf multithreading image mvvm

我有一个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对象的地方。

1 个答案:

答案 0 :(得分:5)

因为您使用Dispatcher.BeginInvoke,所以您正在对UI线程进行所有工作,这会使您的应用无响应。您应该在单独的线程上构建映像。最简单的方法是使绑定异步,并直接调用BuildImageSource方法。

<强>视图模型

public BitmapSource CameraBitmapSource
{
    get
    {
        BuildImageSource();
        return this.cameraBitmapSource;
    }
}

<强> XAML

<Image Source="{Binding CameraBitmapSource, IsAsync=True}" />

只需记住Freeze ImageSourceBuildImageSource以便它可以在UI线程上使用(DependencyObjects只能在创建它们的线程上使用,Freezable除非它们是{{1}}并冻结)