2009-04-23 8 views
6

Jaki jest najlepszy sposób przekazania obrazu w usłudze WCF, a po jego przejściu, wyświetl go w datagrid z?Przechodzenie obrazu przez WCF i wyświetlanie ich w datagrid WPF

+0

Jak duże są przeciętnie zdjęcia, z którymi masz do czynienia? Ile z nich musisz załatwić jednym telefonem? Istnieje kilka dobrych rozwiązań na Twoje pytanie, ale to naprawdę zależy od ilości informacji, które masz do czynienia w każdym połączeniu. Zwrócenie go jako tablicy bajtów jest dobrym rozwiązaniem tylko wtedy, gdy twoje obrazy będą stosunkowo małe i nie będziesz musiał zwracać ich dużej liczby na raz (pytam, ponieważ wstawiasz je do datagridu, więc załóżmy, że możesz odzyskać pewną liczbę z usługi –

Odpowiedz

8

Nie mówię, że jest to jedyna czy najlepszym rozwiązaniem, ale mamy to działa tak:

Co trzeba zrobić, to:

utworzyć metodę WCF, że wróci obraz przez jakiś id lub cokolwiek innego. Należy zwrócić tablicę bajtów (byte []):

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

W swojej klasie danych (obiekty wyświetlane w siatce) czynią nieruchomość obrazu, jego rodzicielka powinna wywołać metodę WCF i przekonwertować tablicę bajtów do 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 
    } 
    } 
} 

W szablonie komórek (lub gdziekolwiek) położyć kontrola obrazu i związania jej właściwość źródła do własności obraz utworzony powyżej:

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

najprostszy sposób nie zrobić UI darmo ze podczas pobierania obrazów ustawia właściwość IsAsync na false, tak jak ja. Ale jest wiele do poprawienia. Na przykład. możesz pokazać animację ładowania podczas ładowania obrazu.

Pokazanie czegoś podczas ładowania czegoś innego można zrealizować za pomocą PriorityBinding (możesz przeczytać o tym tutaj: http://msdn.microsoft.com/en-us/library/ms753174.aspx).

+0

Jak wyświetlić animację podczas ładowania obrazu? –

+0

Zaktualizowałem odpowiedź – arconaut

+0

To tylko dobra odpowiedź, jeśli zdjęcia są małe .. w zależności od rozmiaru obrazu, jeśli są duże lub jeśli jest duża liczba próśb, to rozwiązanie nie zadziała –

0

Czy można załadować obraz WPF ze strumienia? Jeśli tak, możesz napisać usługę WCF, aby zwrócić typ System.IO.Stream.

+1

Nie wiem, dlatego pytam –

+0

Możesz wysłać strumień jako część wiadomości, o ile strumień jest oznaczony jako jedyna część Treść wiadomości Wszystkie inne pola wiadomości będą musiały przejść do nagłówka – SaguiItay