MVVM, многопоточность и источник изображения DataBinidng - PullRequest
1 голос
/ 02 июня 2011

У меня есть реализация MVVM, в которой у меня есть WPF ListBox, который будет содержать коллекцию дочерних элементов управления изображениями WPF. Источник для каждого элемента управления может изменяться так часто, как 3 раза в секунду. Когда в моем списке только одно изображение, жизнь становится великолепной, а мое приложение отзывчивым. Когда я начинаю иметь 4 или 5 дочерних изображений приложения, мое приложение начинает расти, я должен также упомянуть, что мне нужно преобразовать растровое изображение в растровое для каждого нового и / или обновленного изображения, которое у меня есть.

Как мне обновить мои дочерние элементы управления свойством Source, чтобы приложение оставалось максимально отзывчивым?

Вот текущий код в моей ViewModel:

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

            return this.cameraBitmapSource;
         }
    }

BuildImageSource () - это место, где я выбираю свое новое растровое изображение и преобразую его в BitmapSource, а затем назначаю его частному объекту cameraBitmapSource.

1 Ответ

5 голосов
/ 02 июня 2011

Поскольку вы используете Dispatcher.BeginInvoke, вы выполняете всю работу в потоке пользовательского интерфейса, что делает ваше приложение не отвечающим.Вы должны построить изображения в отдельном потоке.Самый простой способ сделать это - сделать привязку асинхронной и вызвать ваш метод BuildImageSource напрямую.

ViewModel

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

XAML

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

Просто запомните Freeze ImageSource в BuildImageSource, чтобы его можно было использовать в потоке пользовательского интерфейса (DependencyObjects можно использовать только в потоке, который их создал, если толькоони Freezable и заморожены)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...