2011-08-09 12 views
5

Mam Listbox, w którym każdy element ma obraz, który jest już zapisany jako zawartość. Wybieram obraz do wyświetlenia za pomocą konwertera.Image Problem z ładowaniem w Listbox, WP7

Jeśli obraz dla odpowiedniej wartości nie istnieje, muszę wyświetlić domyślny obraz , który obsłużyłem w zdarzeniu ImageFailed.

Problem polega na tym, że po uruchomieniu programu otrzymuję domyślny obraz dla kilku już istniejących obrazów. Jeśli przewinię w dół listy i ponownie wykonam kopię zapasową, czasami obraz wyświetlany prawidłowo wyświetla domyślny obraz. Wydaje się, że jest to problem z wydajnością.

Jestem nowicjuszem w zakresie opracowywania aplikacji. Daj mi znać, chociaż może wydawać się to banalne.

Poniżej jest moja realizacja

<ListBox DataContext="{Binding}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
       <StackPanel> 
          <Image Width="90" Height="67" Source="{Binding id,Converter={StaticResource imageConverter}}" ImageFailed="ImageFailed" /> 
          _ 
          _ 
        </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Funkcja konwersji

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
     string Id = (string)value; 
    string imagePath; 
    imagePath = string.Format(AppDefines.channelLogoImgPath, prgSvcId); 
    return imagePath; 
} 

Handler ImageFailed

private void ImageFailed(object sender, ExceptionRoutedEventArgs e) 
{ 
    Image Img = (Image)sender; 
    string imgPath = Defines.defImagePath 
    Uri uri = new Uri(imgPath, UriKind.RelativeOrAbsolute); 
    BitmapImage bDefImage = new BitmapImage(uri); 
    Img.Source = bDefImage; 
} 
+0

+1 za jednoznaczne sformułowanie pytania oraz za pomocą przykładu Xaml & Code! :) –

Odpowiedz

0

Czy dlatego metoda Convert nie używa wartości przekazanej w ale patrzy w górę prgSvcId?

Jeśli ładujesz obrazy z poziomu XAP, możesz przetestować ich istnienie, zamiast polegać na niepowodzeniu załadowania obrazu domyślnego/alternatywnego.

Aby przetestować dla istnienia plików:

if (Application.GetResourceStream(new Uri("/images/myPic.png", UriKind.Relative)) != null) 
{ 
    // file exists 
} 
+0

To był literówka, zmodyfikowałem swój kod, aby wyglądał bardziej ogólnie :). Mam wszystkie pliki dodane jako Treść, Czy istnieje sposób sprawdzenia, czy plik istnieje programowo dla Build action -Content? –

1

Problem polega na tym, że konwerter jest zwrócenie ciąg (ścieżkę do obrazu), a nie ImageSource.

Trzeba coś takiego zamiast:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    string imagePath = string.Format(AppDefines.channelLogoImgPath, value); 
    return new BitmapImage(imagePath); 
} 

Jak zauważył Matt, nie jesteś też przy użyciu identyfikatora jesteś przejazdem do konwertera. Uproszczony kod powyżej zawiera tę poprawkę.

1

Mam do rozwiązania problemu, umieszczam 2 obrazy w tej samej lokalizacji. domyślny obraz jest widoczny od samego początku. Źródło dla obrazu specyficznego dla elementu uzyskuje się jak powyżej (wiązanie). W procedurze obsługi zdarzeń otwartych obrazu danego elementu domyślna widoczność obrazu jest ustawiona na zwinięcie.

Po wykonaniu tej czynności aplikacja działa poprawnie zarówno na emulatorze, jak i na urządzeniu. Na razie są tylko dwie rzeczy, które mogę winić.

Zdarzenie nieudanego obrazu. W niektórych przypadkach zdarzenie nieudanego obrazu jest wyzwalane, a obraz jest również wyświetlany. (Prawdopodobnie istnieje limit czasu itp., Który spowodował wyzwolenie zdarzenia)

Listy i obrazy nie idą w parze.

0

Widzę ten sam problem, wiążę adres URL, a następnie za pomocą puli wątków i usług, aby uzyskać obraz w tle i załadować go z powrotem. Stworzyłem niestandardowy formant na liście, ale zależność Właściwość w formancie wydaje się zwracać losowe adresy URL z całej listy. Na początku myślałem, że to jakiś problem synchronizacji, ale myślę, że to dlatego, że ListBox nie jest jak normalny listbox SL, ponieważ używa VirtualizingStackPanel. Istnieją pewne wytyczne tutaj:

http://blogs.msdn.com/b/slmperf/archive/2010/10/06/silverlight-for-windows-phone-7-listbox-scroll-performance.aspx

Zasadniczo nie spróbować zrobić coś niezwykłego na liście!