2009-04-23 39 views
6

Cách tốt nhất để truyền hình ảnh trong dịch vụ WCF là gì và sau khi truyền, hãy hiển thị hình ảnh đó trong dữ liệu thống kê WPF?Truyền hình ảnh qua WCF và hiển thị chúng trong dữ liệu WPF

+0

Hình ảnh bạn đang xử lý trung bình là bao nhiêu? Bạn cần phải xử lý bao nhiêu trong một cuộc gọi? Có một số giải pháp tốt cho câu hỏi của bạn, nhưng nó thực sự phụ thuộc vào lượng thông tin mà bạn phải đối phó với mỗi cuộc gọi. Trả về nó như là một mảng byte chỉ là một giải pháp tốt nếu hình ảnh của bạn sẽ tương đối nhỏ và bạn không phải trả lại một số lượng lớn trong một thời điểm (tôi hỏi vì bạn đang đặt nó trong một DataGrid, vì vậy tôi –

Trả lời

8

Tôi không nói rằng đây là chỉ hoặc giải pháp tốt nhất, nhưng chúng tôi có nó làm việc như thế này:

Những gì bạn cần làm là:

Tạo một phương pháp WCF rằng sẽ quay trở lại hình ảnh bởi một số id hoặc bất cứ điều gì. Nó sẽ trả về mảng byte (byte []):

public byte[] GetImage(int id) 
{ 
    // put your logic of retrieving image on the server side here 
} 

Trong lớp dữ liệu của bạn (đối tượng hiển thị trong lưới) tạo ra một hình ảnh bất động sản, getter của nó nên gọi phương thức WCF và chuyển đổi mảng byte để một BitmapImage:

public BitmapImage Image 
{ 
    get 
    { 
    // here - connection is your wcf connection interface 
    //  this.ImageId is id of the image. This parameter can be basically anything 
    byte[] imageData = connection.GetImage(this.ImageId);  

    // Load the bitmap from the received byte[] array 
    using (System.IO.MemoryStream stream = new System.IO.MemoryStream(imageData, 0, imageData.Length, false, true)) 
    { 
    BitmapImage bmp = new BitmapImage(); 
    bmp.BeginInit(); 
    bmp.StreamSource = stream; 

    try 
     { 
     bmp.EndInit(); 
     bmp.Freeze(); // helps for performance 

     return bmp; 
     } 
    catch (Exception ex) 
     { 
     // Handle exceptions here 
     } 

    return null; // return nothing (or some default image) if request fails 
    } 
    } 
} 

Trong mẫu của bạn tế bào (hoặc bất cứ nơi nào) đặt dấu kiểm soát hình ảnh và liên kết hữu Nguồn của nó đối với tài sản hình ảnh được tạo ở trên:

<DataTemplate> <!-- Can be a ControlTemplate as well, depends on where and how you use it --> 
    <Image 
    Source={Binding Image, IsAsync=true} 
    /> 
</DataTemplate> 

cách đơn giản nhất để không làm cho giao diện người dùng miễn phí ze khi truy xuất hình ảnh sẽ thiết lập thuộc tính IsAsync thành false như tôi đã làm. Nhưng có rất nhiều thứ để cải thiện. Ví dụ. bạn có thể hiển thị một số hoạt ảnh đang tải trong khi Hình ảnh đang được tải.

Hiển thị nội dung nào đó trong khi tải nội dung khác có thể được thực hiện bằng PriorityBinding (bạn có thể đọc về nó tại đây: http://msdn.microsoft.com/en-us/library/ms753174.aspx).

+0

làm cách nào để hiển thị hình ảnh động khi đang tải hình ảnh? –

+0

Tôi đã cập nhật câu trả lời – arconaut

+0

Đây chỉ là câu trả lời hay nếu hình ảnh nhỏ. Tùy thuộc vào kích thước của hình ảnh Nếu chúng lớn hoặc nếu có một lượng lớn yêu cầu, giải pháp này sẽ không hoạt động –

0

Bạn có thể tải hình ảnh WPF từ luồng không? Nếu có, thì bạn có thể viết dịch vụ WCF để trả về kiểu System.IO.Stream.

+1

Tôi không biết đó là lý do tại sao tôi yêu cầu –

+0

Bạn có thể gửi luồng dưới dạng một phần của thư, miễn là luồng được đánh dấu là phần duy nhất của Nội dung của tin nhắn Tất cả các trường khác của tin nhắn sẽ phải đi đến tiêu đề – SaguiItay

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