2010-06-30 52 views
6

Tôi gặp sự cố khi hiển thị hình ảnh có URL web trong điều khiển người dùng WPF. Tôi đã làm việc thông qua tất cả các đề xuất cho một vấn đề tương tự được yêu cầu trên trang web này vào tháng 8 năm 2008 (Image UriSource and Data Binding) nhưng không có đề xuất nào trong số đó có hiệu quả.Liên kết URISource và Liên kết dữ liệu hình ảnh WPF bằng cách sử dụng http: \ URL

Những gì tôi muốn làm là:

<Image Width="50" Name="MemberImage"> 
    <Image.Source> 
     <BitmapImage DecodePixelWidth="50" UriSource="{Binding Member.ImageFilePathUri}" /> 
    </Image.Source> 
</Image> 

ImageFilePathUri là một Uri tạo ra từ các đường dây thông qua:

public Uri ImageFilePathUri 
    { 
     get 
     { 
      return new Uri(this.ImageFilePath); 
     } 
    } 
} 

này cung cấp cho các "tài sản 'UriSource' hoặc tài sản 'StreamSource ' phải được thiết lập." lỗi như mong đợi.

Tôi cũng đã cố gắng sử dụng một bộ chuyển đổi giá trị:

public class ImageConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var image = new BitmapImage(); 
     image.BeginInit(); 
     if (value != null) 
     { 
      image.UriSource = new Uri((string)value); 
     } 
     image.DecodePixelWidth = 50; 
     image.EndInit(); 
     return image; 
    } 
} 

Tuy nhiên, liên kết với nó bằng cách sử:

<Image Name="TestImage" Width="50" Source="{Binding Path=Member.ImageFilePath, Converter=Parliament.HansardApplicationSuite.Logging.Helpers.ImageConverter}"></Image> 

không hiển thị hình ảnh.

Một nỗ lực hơn nữa để tải các hình ảnh theo chương trình, trong các nhà xây dựng kiểm soát và/hoặc sự kiện điều khiển Loaded cũng chưa từng làm việc:

if (this.MemberRollItemViewModel.Member != null) 
{ 
    var image = new BitmapImage(); 
    image.BeginInit(); 
    image.UriSource = new Uri(this.MemberRollItemViewModel.Member.ImageFilePath); 
    image.DecodePixelWidth = 50; 
    image.EndInit(); 

    this.MemberImage.Source = image; 
} 

Một trong những điều đó đã làm việc được lưu hình ảnh vào một tập tin địa phương đường dẫn và hiển thị rằng:

<Image Width="50" Name="MemberImage"> 
    <Image.Source> 
     <BitmapImage DecodePixelWidth="50" UriSource="C:\Data\6bc64e7b-2df5-40d5-b6c4-eaf732318222.jpg" /> 
    </Image.Source> 
</Image> 

Điều này rõ ràng chỉ hữu ích trong việc gỡ lỗi vấn đề và không phải là giải pháp. Cùng một mã nhưng thay thế địa chỉ http cho đường dẫn tệp cục bộ không hoạt động.

<Image.Source> 
    <BitmapImage DecodePixelWidth="50" UriSource="http://member.org/6bc64e7b-2df5-40d5-b6c4-eaf732318222.jpg" /> 
</Image.Source> 

Cập nhật:

này là việc thực hiện sở hữu MemberImage.

public BitmapImage MemberImage 
{ 
    get 
    { 
     var image = new BitmapImage(); 

     if (this.Member != null) 
     { 
      WebRequest request = WebRequest.Create(new Uri(this.Member.ImageFilePath, UriKind.Absolute)); 
      request.Timeout = -1; 
      WebResponse response = request.GetResponse(); 
      Stream responseStream = response.GetResponseStream(); 
      BinaryReader reader = new BinaryReader(responseStream); 
      MemoryStream memoryStream = new MemoryStream(); 

      byte[] bytebuffer = new byte[BytesToRead]; 
      int bytesRead = reader.Read(bytebuffer, 0, BytesToRead); 

      while (bytesRead > 0) 
      { 
       memoryStream.Write(bytebuffer, 0, bytesRead); 
       bytesRead = reader.Read(bytebuffer, 0, BytesToRead); 
      } 

      image.BeginInit(); 
      memoryStream.Seek(0, SeekOrigin.Begin); 

      image.StreamSource = memoryStream; 
      image.EndInit(); 
     } 

     return image; 
    } 
} 

Cập nhật:

Đây là cách tôi đang ràng buộc để kiểm soát trong quan điểm của tôi:

<Image Width="50" Source="{Binding MemberImage}" /> 

MemberImage là tài sản tôi đã đưa ra ở trên. Ngữ cảnh dữ liệu của tôi đang được đặt chính xác vì thuộc tính đó đang được chạy, nó chỉ không trả về một hình ảnh.

Trả lời

10

Không thể cung cấp URL Web làm nguồn cho thuộc tính UriSource của BitmapImage. Nếu đó là weburl bạn cần tải xuống hình ảnh đó cục bộ và liên kết đường dẫn đó với UriSource. Xem dưới đây

http://blogs.windowsclient.net/cennest/archive/2010/03/26/code-for-keeps-wpf-silverlight-retrieve-images-from-db-url.aspx

Cập nhật:

void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     var image = new BitmapImage(); 
     int BytesToRead=100; 

     WebRequest request = WebRequest.Create(new Uri("http://www.interweb.in/attachments/pc-wallpapers/16187d1222942178-nature-wallpaper-nature-summer-wallpaper.jpg", UriKind.Absolute)); 
     request.Timeout = -1; 
     WebResponse response = request.GetResponse(); 
     Stream responseStream = response.GetResponseStream(); 
     BinaryReader reader = new BinaryReader(responseStream); 
     MemoryStream memoryStream = new MemoryStream(); 

     byte[] bytebuffer = new byte[BytesToRead]; 
     int bytesRead = reader.Read(bytebuffer, 0, BytesToRead); 

     while (bytesRead > 0) 
     { 
      memoryStream.Write(bytebuffer, 0, bytesRead); 
      bytesRead = reader.Read(bytebuffer, 0, BytesToRead); 
     } 

     image.BeginInit(); 
     memoryStream.Seek(0, SeekOrigin.Begin); 

     image.StreamSource = memoryStream; 
     image.EndInit(); 

     myImage.Source = image; 
    } 
+0

Rag, nhờ các liên kết. Tôi đã thử thực hiện điều đó bằng cách tạo một thuộc tính, MemberImage, trả về một BitmapImage bằng cách sử dụng ví dụ trong blog và sau đó ràng buộc Image.Source của tôi với thuộc tính đó nhưng nó vẫn không hiển thị. Điều này có nghĩa là tôi cần lưu hình ảnh trước và sau đó liên kết với đường dẫn tệp đó? –

+0

Không, nó sẽ hoạt động. Bạn có thể đăng mã thuộc tính MemberImage không? – Ragunathan

+0

Tôi đã cập nhật câu hỏi ban đầu của mình với việc triển khai MemberImage. Điều này vẫn không hoạt động, không trả lại bất kỳ hình ảnh nào. –

Các vấn đề liên quan