【问题标题】:MVVM, Threading and Image Source DataBinidngMVVM、线程和图像源 DataBinidng
【发布时间】:2011-09-06 18:39:07
【问题描述】:

我有一个 MVVM 实现,其中我有一个 WPF ListBox,它将包含一组子 WPF Image 控件。每个控件的 Source 可能每秒更改 3 次。当我的列表中只有一张图片时,生活是美好的,我的应用程序是响应式的。当我开始有 4 或 5 个我的应用程序子图像时,我的应用程序开始打磨,我还应该提到,我必须为我拥有的每个新的和/或更新的图像进行 Bitmap 到 BitmapSource 的转换。

我应该如何更新我的子控件 Source 属性,同时让我的应用程序尽可能地响应?

这是我的 ViewModel 中的当前代码:

public BitmapSource CameraBitmapSource
    {
        get
        {
            Application.Current.Dispatcher.BeginInvoke((Action)delegate
                    {
                        BuildImageSource();
                    }, DispatcherPriority.Background);

            return this.cameraBitmapSource;
         }
    }

BuildImageSource() 是我获取新位图并转换为 BitmapSource 然后分配给我的私有 cameraBitmapSource 对象的位置。

【问题讨论】:

  • WPF 不是动画的好选择。你正试图用扳手敲钉子
  • @Jay:我不确定这是否准确。这种动画方法,通过数据绑定更新图像属性,我同意你的看法。但是WPF通过storyboards等直接支持其他类型的动画。

标签: wpf multithreading image mvvm


【解决方案1】:

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

视图模型

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

XAML

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

只要记住Freeze ImageSource in BuildImageSource 这样它就可以在 UI 线程上使用(DependencyObjects 只能在创建它们的线程上使用,除非它们是 Freezable 和冷冻)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2011-06-03
    • 2019-03-21
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多