Как перевести URL в BitMapImage асинхронно

У меня есть ссылка. Есть функция, в которую передается эта ссылка. Она возвращает битмап, но не асихнронно, из за чего UI зависает. Как сделать это асинхронно, без конвертера в отдельном классе.

public async Task<BitmapImage> converter(string url)
    {

            var bi = new BitmapImage();
            bi.BeginInit();
            bi.UriSource = new Uri(url);
            bi.EndInit();
            return bi;
        

    }

Ответы (1 шт):

Автор решения: aepot

Берем какой-нибудь класс и реализуем на нем INotifyPropertyChanged

using System.ComponentModel;
using System.Runtime.CompilerServices;

public class NotifyPropertyChanged : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Наследуем от него еще один какой-нибудь класс и добавляем в него свойство-ссылку

public class MyClass : NotifyPropertyChanged
{
    private string url;

    public string Url
    {
        get => url; 
        set
        {
            url = value;
            OnPropertyChanged();
        }
    }
}

Модель данных готова. С такой модели интерфейс умеет обновляться сам через привязку данных.

В XAML

<Image Source="{Binding Url}"/>

Теперь в коде окна

public partial class MainWindow : Window
{
    private readonly MyClass data;

    public MainWindow()
    {
        InitializeComponent();
        data = new MyClass();
        DataContext = data;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        data.Url = "https://ссылка";
    }
}

Вот так ничего виснуть не будет.

→ Ссылка