Tôi muốn tải Gravatar-Images và đặt chúng từ mã phía sau thành Điều khiển hình ảnh WPF. Vì vậy, các mã trông nhưĐặt WPF Tải ảnh không đồng bộ
imgGravatar.Source = GetGravatarImage(email);
đâu GetGravatarImage trông giống như:
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.UriSource = new Uri(GravatarImage.GetURL("http://www.gravatar.com/avatar.php?gravatar_id=" + email) , UriKind.Absolute);
bi.EndInit();
return bi;
Thật không may này khóa GUI khi kết nối mạng chậm. Có cách nào để chỉ định nguồn hình ảnh và cho phép tải hình ảnh trong nền mà không chặn giao diện người dùng không?
Cảm ơn!
BitmapImage cũng có [hàm tạo với tham số Uri] (http://msdn.microsoft.com/en-us/library/ms602473.aspx), giúp bạn lưu các cuộc gọi BeginInit/EndInit. – Clemens
+1 không biết về nó, gợi ý hay. Tôi chỉ sao chép mã từ tác giả và không nghĩ cách tối ưu hóa việc tải xuống thực tế, thay vào đó tôi tập trung vào giải quyết vấn đề khối UI một cách thanh lịch (và dĩ nhiên nó chặn, nếu mã không đồng bộ). Tôi nghĩ rằng để sử dụng lặp đi lặp lại, bộ chuyển đổi cũng có thể nhận được url đầy đủ từ ràng buộc để được tái sử dụng nhiều hơn, thay vì email. Tôi không thích sử dụng 'ThreadPool' bởi vì bạn phải quản lý việc điều phối tất cả các thời gian. Điều này làm cho nó không đủ thanh lịch với tôi cho một ứng dụng MVVM thuần túy. – JanW
Bạn có thể giải thích tại sao việc tạo BitmapImage sẽ chặn khi không được gọi là không đồng bộ. Tại sao nó lại có thuộc tính 'IsDownloading' và' DownloadCompleted'. Nếu bạn chỉ cần đặt thuộc tính 'Nguồn' của Hình ảnh trong XAML thành URL có tham chiếu hình ảnh lớn trên web, giao diện người dùng sẽ không chặn. Thay vào đó, WPF tải hình ảnh xuống dưới nền và hiển thị nó ngay sau khi quá trình tải xuống hoàn tất. – Clemens