#c_sharp #wpf #mvvm #async_await
Всем привет. Есть пользовательский элемент управления. Упрощенная его разметка показана ниже:Codebehind данного элемента управления: public partial class MyCanvas : UserControl { public MapControl() { InitializeComponent(); } static MapControl() { MyBackgroundProperty = DependencyProperty. Register("MyBackground", typeof(Brush), typeof(MapControl)); } public static DependencyProperty MyBackgroundProperty; public Brush MyBackground { get { return (Brush)GetValue(MyBackgroundProperty);} set { SetValue(MyBackgroundProperty, value); } } } Далее данный пользовательский элемент управления используется в главном окне приложения следующим образом: Также есть следующая MainWindowViewModel, которая биндится к главному окну приложения: public class MainViewModel : ViewModelBase { private IMyService _service; private ImageBrush _image; public ImageBrush Image { get { return _image; } set { _image= value; OnPropertyChanged("Image"); } } private int _zoom; public int Zoom { get { return _zoom; } set { _zoom = value; OnPropertyChanged("Zoom"); // Обновляю картинку асинхронно. UpdateImage(); } } private async void UpdateImage() { // Данный метод возвращает новую картинку! // Картинка возвращается как Task Image = await _service.GetNewImageTaskAync(); // Далее происходит исключение: // Необходимо создать DependencySource в // том же потоке, в котором создан DependencyObject } } Проблема заключается в том, что если я обновляю свойство Image данными, полученными из другого потока, то я получаю исключение "Необходимо создать DependencySource в том же потоке, в котором создан DependencyObject". Пробовал по-разному синхронизировать потоки, но ничего не получилось. Подскажите, пожалуйста, как мне в свойство Image "положить" данные, созданные в другом потоке.
Ответы
Ответ 1
Кажется, понятно. Весь код, который вы привели, правильный. Ошибка должна быть в GetNewImageTaskAync. Либо нужно создавать image в UI-потоке, либо после создания вызвать на нём Freeze().
Комментариев нет:
Отправить комментарий