微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 AvaloniaUI 中,如何显示来自 Web URL 的图像?

如何解决在 AvaloniaUI 中,如何显示来自 Web URL 的图像?

我正在使用 ReactiveUI 和 MVVM 开发 Avalonia 应用程序。 我想显示来自 Web URL 的图像,实现这一目标的最佳行动方案是什么? 我已经设置了以下绑定:

                this.OneWayBind(
                    viewmodel,vm => vm.UserProfileImageUrl,v => v.ProfileImage.source,ImageConverter
                ).disposeWith(disposables);

和绑定适配器:

        private IImage ImageConverter(string arg)
        {
        
        }

但是我不知道如何实现 Binding 适配器以在不阻塞 UI 的情况下下载图像。 Android 上有类似 Glide 的工具吗?

先谢谢你,

解决方法

您可以异步下载图像并将其存储在您的 ViewModel 中,或者使用下载完成事件,例如:

public class MainWindowViewModel : ViewModelBase
    {
        private string chessboardUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Chess_Board.svg/2000px-Chess_Board.svg.png";
        public string ChessboardUrl
        {
            get => chessboardUrl;
            set {
                this.RaiseAndSetIfChanged(ref chessboardUrl,value);
                DownloadImage(ChessboardUrl);
                System.Diagnostics.Debug.WriteLine(ChessboardUrl);
            }
        }

        private Avalonia.Media.Imaging.Bitmap chessboard = null;
        public Avalonia.Media.Imaging.Bitmap Chessboard
        {
            get => chessboard;
            set => this.RaiseAndSetIfChanged(ref chessboard,value);
        }

        public MainWindowViewModel()
        {
            DownloadImage(ChessboardUrl);
        }

        public void DownloadImage(string url)
        {
            using (WebClient client = new WebClient())
            {
                client.DownloadDataAsync(new Uri(url));
                client.DownloadDataCompleted += DownloadComplete;
            }
        }

        private void DownloadComplete(object sender,DownloadDataCompletedEventArgs e)
        {
            try
            {
                byte[] bytes = e.Result;

                Stream stream = new MemoryStream(bytes);

                var image = new Avalonia.Media.Imaging.Bitmap(stream);
                Chessboard = image;
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex);
                Chessboard = null; // Could not download...
            }
            
        }
    }

然后您可以轻松绑定到 Url 和关联的图像。例如像这样来自 XAML(带有适当的 DataContext):

<StackPanel>
    <Image Source="{Binding Chessboard}"
           Width="200"
           Height="200"
           Name="MyImage"></Image>
    <TextBox Text="{Binding ChessboardUrl}"></TextBox>
    
</StackPanel>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。