2010-11-06 3 views
6

Hey. J'ai une liste d'éléments que l'utilisateur peut rechercher. Les résultats de la recherche sont affichés dans une zone de liste. Chaque objet animal a un chemin vers une image dans le stockage isolé. Quel est le moyen le plus rapide de lier mon contrôle Image dans l'élément listbox à l'image dans le stockage isolé? Les exemples que j'ai vus ont tendance à afficher des images sur Internet plutôt que sur le stockage isolé. Si j'ai environ 10 images, il semble prendre toute la mémoire et s'écraser. grâceRelier l'image dans le stockage isolé

EDIT:

J'utilise dans ma classe BitmapConverter (IValueConverter hérite)

 public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (value !=null) 
      { 
       BitmapImage bitmapImage = new BitmapImage(); 
       bitmapImage.SetSource(new MemoryStream((Byte[]) value)); 
       return bitmapImage; 
      } 
      else 
      { 
       return null; 
      } 
     } 

J'ai ce en haut de mon fichier AppResource.xaml:

<ImageApp_Converter:BitmapConverter x:Key="bmpConverter" />  

In my style, within the AppResource.xaml file: 

<Image HorizontalAlignment="Left" Margin="8,8,0,4" Width="160" Height="120" Source="{Binding Converter={StaticResource bmpConverter}}" /> 

J'ai défini un point d'arrêt dans mon BitmapConverter, mais il n'a jamais été appelé. Je n'ai jamais utilisé IValueConverter auparavant, donc toute aide serait géniale. Merci

+0

Avez-vous oublié le chemin dans votre liaison?Si vous vous liez à votre Datacontext (et non à un chemin d'accès), vous devez le mentionner par {Binding., Converter = {...}} ou {Binding Path =., Converter = {...}} –

Répondre

6

Il y a quelques problèmes dans le code affiché. Certains peuvent simplement manquer dans votre exemple:

Tout d'abord, votre liaison au convertisseur ne spécifie pas pour à lier à pour obtenir sa valeur, donc il n'est jamais appelé. Au minimum, il faut un chemin = (ou simplement un nom de propriété comme raccourci) sinon le convertisseur ne sera pas appelé. Où définissez-vous l'ItemSource de votre liste?

Deuxièmement, les valeurs transmises sont des noms de fichiers de chaînes. Votre convertisseur doit les utiliser comme noms de fichiers et ouvrir un flux basé sur ce nom. En ce moment, il essaie d'utiliser les noms comme des tableaux d'octets. Enfin, si les images sont un ensemble fixe, il serait plus logique de les stocker dans un dossier d'images sous ClientBin et de s'y référer simplement avec la syntaxe de chemin suivante "/images/imagename.jpg" etc. impliquer la mise en cache du navigateur automatiquement. Vous n'avez pas besoin d'un convertisseur pour cela. (La clé est le premier «/». Sans que Silverlight suppose que les images sont dans le module courant à la place)

alt text

est Ci-dessous un exemple complet en utilisant les images présentées dans le dossier ClientBin/images qui ressemble à quand exécuter:

alt text

Exemple fichier XAML:

<UserControl x:Class="SilverlightApplication1.IsoImages" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:ImageApp_Converter="clr-namespace:SilverlightApplication1" mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="400"> 
    <Grid x:Name="LayoutRoot" Background="White"> 
     <ListBox x:Name="ImageList"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal" Background="AliceBlue"> 
         <Image HorizontalAlignment="Left" Margin="8,8,0,4" Width="160" Height="120" Source="{Binding Path=Filename}" /> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 
</UserControl> 

Les s le code suffisant derrière est:

using System.Collections.Generic; 
using System.Windows.Controls; 

namespace SilverlightApplication1 
{ 
    public partial class IsoImages : UserControl 
    { 
     public IsoImages() 
     { 
      InitializeComponent(); 
      List<ImageItem> images = new List<ImageItem>() 
             { 
              new ImageItem("/images/Image1.jpg"), 
              new ImageItem("/images/Image2.jpg"), 
              new ImageItem("/images/Image3.jpg"), 
              new ImageItem("/images/Image4.jpg") 
             }; 
      this.ImageList.ItemsSource = images; 
     } 
    } 

    public class ImageItem 
    { 
     public string Filename{ get; set; } 
     public ImageItem(string filename) 
     { 
      Filename = filename; 
     } 
    } 
} 
+0

Wow, bonne réponse. Merci! – XSL

0

Vous manquez probablement de mémoire car vous chargez de manière répétée le même fichier dans les nouveaux objets BitmapSource. Vous devez créer seulement "environ 10" BitmapSource objets un pour chaque fichier. Puis réutilisez ces instances BitmapSource en les affectant aux propriétés Image.Source.

Une façon de faire est d'utiliser une implémentation de IValueConverter qui maintient un dictionnaire statique de chemin de fichier à BitmapSource paire de valeurs de clé.

+0

Merci pour l'aide. Je n'arrive pas à faire fonctionner IValueConverter, mais j'ai mis à jour la question avec mon code. – XSL

Questions connexes