Страницы

Поиск по вопросам

вторник, 7 января 2020 г.

Обновление свойства, привязанного к контролу, из другого потока

#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().

Комментариев нет:

Отправить комментарий